CTFE implementation

Don Clugston dac at nospam.com.au
Mon Feb 11 05:23:47 PST 2008


Frank Benoit wrote:
> I want to initialize constant GUID structure instanzes in D1. This is 
> part of doing a port, so i want to keep most of the original code 
> unchanged.
> 
> In Java:
> public static const GUID IIDJavaBeansBridge = 
> IIDFromString("{8AD9C840-044E-11D1-B3E9-00805F499D93}");
> 
> This is in Java no problem, IIDFromString is executed at startup.
> In D i could change it too this:
> public static const GUID IIDJavaBeansBridge = { 0x8AD9C840, 0x044E, 
> 0x11D1, [0xB3, 0xE9, 0x00, 0x80, 0x5F, 0x49, 0x9D, 0x93]};
> 
> This compiles, but there are many of these GUID constants and for later 
> merges and diffs, i really would like to keep the Java form. So i 
> thought CTFE might do the trick.
> 
> // struct GUID { // size is 16
> // align(1):
> //     DWORD   Data1;
> //     WORD    Data2;
> //     WORD    Data3;
> //     BYTE[8] Data4;
> // }
> 
> int HexToInt( char[] str ){
>     uint i = 0;
>     foreach( c; str ){
>         i <<= 4;
>         int v = -1;
>         if( c >= 'A' && c <= 'F' ){
>             v = c - 'A' + 10;
>         }
>         else if( c >= '0' && c <= '9' ){
>             v = c - '0';
>         }
>         assert( v >= 0 && v < 16, "for "~str~" char "~c );
>         i |= v;
>     }
>     return i;
> }
> 
> private static GUID IIDFromString( char[] str ){
>     assert( str.length is 38 );
>     assert( str[0] is '{' );
>     assert( str[9] is '-' );
>     assert( str[14] is '-' );
>     assert( str[19] is '-' );
>     assert( str[24] is '-' );
>     assert( str[37] is '}' );
>     GUID res;
>     res.Data1 = HexToInt( str[1 .. 9] );
>     res.Data2 = HexToInt( str[10 .. 14] );
>     res.Data3 = HexToInt( str[15 .. 19] );
>     //res.Data4[0] = HexToInt( str[20 .. 22] );
>     //res.Data4[1] = HexToInt( str[22 .. 24] );
>     //for( int i = 0; i < 5; i++ ){
>     //    res.Data4[i+2] = HexToInt( str[25+2*i .. 25+2*i] );
>     //}
>     return res;
> }
> 
> This works for the member Data1, Data2, Data3. But not for the Data4 
> member, which is a static array. Uncommenting those lines yield the 
> "cannot evaluate at compile time" error.
> 
> I tried to do a union, also without luck.
> 
> Does someone have a solution for this?

Looks like a CTFE bug.
Try creating the GUID struct in place, that often works better.

return GUID(HexToInt( str[1 .. 9] ), ...
[HexToInt( str[25+2*0 .. 25+2*0], ...
,HexToInt( str[25+2*5 .. 25+2*5]] );


More information about the Digitalmars-d-learn mailing list