Make shared static this() encoding table compilable

Patrick Schluter Patrick.Schluter at bbox.fr
Thu Mar 17 12:11:19 UTC 2022


On Thursday, 17 March 2022 at 11:36:40 UTC, Patrick Schluter 
wrote:
> On Monday, 14 March 2022 at 09:40:00 UTC, zhad3 wrote:
>> Hey everyone, I am in need of some help. I have written this 
>> Windows CP949 encoding table 
>> https://github.com/zhad3/zencoding/blob/main/windows949/source/zencoding/windows949/table.d which is used to convert CP949 to UTF-16.
>>
>> After some research about how to initialize immutable 
>> associative arrays people suggested using `shared static 
>> this()`. So far this worked for me, but I recently discovered 
>> that DMD cannot compile this in release mode with 
>> optimizations.
>>
>> `dub build --build=release`  or `dmd` with `-release -O` fails:
>>
>> ```
>> code      windows949
>> function  
>> zencoding.windows949.fromWindows949!(immutable(ubyte)[]).fromWindows949
>> code      table
>> function  zencoding.windows949.table._sharedStaticCtor_L29_C1
>> dmd failed with exit code -11.
>> ```
>>
>> I usually compile my projects using LDC where this works fine, 
>> but I don't want to force others to use LDC because of this 
>> one problem.
>>
>> Hence I'd like to ask on how to change the code so that it 
>> compiles on DMD in release mode (with optimizations). I 
>> thought about having a computational algorithm instead of an 
>> encoding table but sadly I could not find any references in 
>> that regard. Apparently encoding tables seem to be the 
>> standard.
>
> Why not use a simple static array (not an associative array). 
> Where the values are indexed on `key - min(keys)`. Even with 
> the holes in the keys (i.e. keys that do not have corresponding 
> values) it will be smaller that the constructed associative 
> array? The lookup is also faster.
Something akin to
```d
auto lookup(ushort key)
{
   return cp949[key-0x8141];
}

immutable ushort[0xFDFE-0x8141+1] cp949 = [
0x8141-0x8141: 0xAC02,
0x8142-0x8141: 0xAC03,
0x8143-0x8141: 0xAC05,
0x8144-0x8141: 0xAC06,
0x8145-0x8141: 0xAC0B,
0x8146-0x8141: 0xAC0C,
0x8147-0x8141: 0xAC0D,
0x8148-0x8141: 0xAC0E,
0x8149-0x8141: 0xAC0F,
0x814A-0x8141: 0xAC18,
0x814B-0x8141: 0xAC1E,
0x814C-0x8141: 0xAC1F,
0x814D-0x8141: 0xAC21,
0x814E-0x8141: 0xAC22,
0x814F-0x8141: 0xAC23,
0x8150-0x8141: 0xAC25,
0x8151-0x8141: 0xAC26,
0x8152-0x8141: 0xAC27,
0x8153-0x8141: 0xAC28,
0x8154-0x8141: 0xAC29,
0x8155-0x8141: 0xAC2A,
0x8156-0x8141: 0xAC2B,
0x8157-0x8141: 0xAC2E,
0x8158-0x8141: 0xAC32,
0x8159-0x8141: 0xAC33,
0x815A-0x8141: 0xAC34,
0x8161-0x8141: 0xAC35,
0x8162-0x8141: 0xAC36,
0x8163-0x8141: 0xAC37,
...
0xFDFA-0x8141: 0x72A7,
0xFDFB-0x8141: 0x79A7,
0xFDFC-0x8141: 0x7A00,
0xFDFD-0x8141: 0x7FB2,
0xFDFE-0x8141: 0x8A70,
];
```


More information about the Digitalmars-d-learn mailing list