Has someone encountered similar issues with -cov?

Ola Fosheim Grøstad via Digitalmars-d digitalmars-d at puremagic.com
Sat Jul 2 15:22:11 PDT 2016


On Saturday, 2 July 2016 at 15:15:39 UTC, Guillaume Boucher wrote:
> U opCast(U, T)(T payload)
> {
>         import std.traits;
>         enum Tsizeof = is(T==bool) ? 0 : T.sizeof;
>         enum Usizeof = is(U==bool) ? 0 : U.sizeof;
>         enum noCheck = isUnsigned!T == isUnsigned!U && Tsizeof 
> <= Usizeof ||
>                        isUnsigned!T && Tsizeof < Usizeof;
>         enum checkPayload = !isUnsigned!T && isUnsigned!U;
>         enum checkResult = isUnsigned!T && !isUnsigned!U;
>         static if (checkResult)
>         {
>                 static assert(U.sizeof <= T.sizeof);  // I 
> don't understand this
>         }
>
>         if (!checkPayload || payload >= 0)
>         {
>                 auto result = cast(U) payload;
>                 if (noCheck || result == payload && 
> (!checkResult || result >= 0))
>                         return result;
>         }
>         return hook!U(payload);
> }

I got to something similar (probably with some typos), assuming 
.sizeof exists:


U opCast(U, T)(T payload)
{
     import std.traits;

     enum unsigned_to_signed =  isUnsigned!T && !isUnsigned!U;
     enum signed_to_unsigned =  !isUnsigned!T && isUnsigned!U;
     enum maybe_to_smaller = T.sizeof >= U.sizeof;
     enum to_smaller = T.sizeof > U.sizeof;

     static assert( !unsigned_to_signed || maybe_to_smaller);

     if( !signed_to_unsigned || to_smaller || payload >= 0 )
     {
         auto result = cast(U) payload;
         if (result == payload && !( unsigned_to_signed && result 
< 0))
             return result;
     }

     return hook!U(payload);
}





More information about the Digitalmars-d mailing list