C++ bounded::integer library

"Nordlöw" via Digitalmars-d digitalmars-d at puremagic.com
Tue May 20 06:03:58 PDT 2014


On Tuesday, 20 May 2014 at 09:45:12 UTC, Dominikus Dittes Scherkl 
wrote:
> On Sunday, 18 May 2014 at 21:58:54 UTC, bearophile wrote:
>> I presume some ways to improve it are to add to core.bitop 
>> some D standard intrinsics to detect overflows and carry, to 
>> increase run-time performance to sufficient levels. If they 
>> are not fast, people will be less willing to used them.
> I'm implementing a "safeSigned" type (which uses the bad 
> asymmetric min value of signed types as "NaN"), but one 
> side-product is a somewhat useful function to check for 
> overflow (it doesn't throw, instead the result will be T.max 
> for unsigned arguments or T.min for signed arguments). It 
> doesn't create much overhead and is very easy to do:
>
> T saveOp(string op, T)(T x, T y) pure @save @nogc 
> if(isIntegral!T && (op=="+" || op=="-" || op=="<<" || op=="*"))
> {
>    mixin("x "~op~"= y");
>    static if(isSigned!T)
>    {
>       static if(op == "*")
>       {
>          asm naked { jnc opok; }
>       }
>       else
>       {
>          asm naked { jno opok; }
>       }
>       x = T.min;
>    }
>    else // unsigned
>    {
>       asm naked { jnc opok; }
>       x = T.max;
>    }
>    opok:
>    return x;
> }

Interesting.

You have a typo: @save instead of @safe

You should also guard the use of asm to x86 architectures only 
with version.


More information about the Digitalmars-d mailing list