Struct immutable data and dict

nkm1 t4nk074 at openmailbox.org
Tue Sep 4 12:27:47 UTC 2018


On Tuesday, 4 September 2018 at 11:25:15 UTC, Alex wrote:
> On Tuesday, 4 September 2018 at 10:30:24 UTC, Timoses wrote:
>>
>> However, of course this also fails because randomly assigning 
>> the array elements will overwrite it. So the associative array 
>> seems like the better idea. However, not being able to 
>> INITIALIZE an assoc array element disallows its usage.
>>
>> Is there any solution, trick or workaround??
> I tried two workarounds:
> 1) let the immutable away.
> 2) preallocate a full array of immutables. Then, misuse the 
> assoc array by using the keys only. If the key is there, then, 
> yield the appropriate element from the preallocated array. If 
> not, yield the "elephant in Cairo".

I also had this problem recently. I think aa.require() should 
allow to add immutables (feature request). Anyway, my workaround 
was along the lines of:

final class AA(Key, Value)
{
     Value[] _storage;
     size_t[Key] _aa;

     void opIndexAssign(Value value, Key key)
     {
         if (key !in _aa)
         {
             _storage ~= value;
             _aa[key] = _storage.length - 1;
         }
     }

     Value opIndex(Key key)
     {
         if (auto index = key in _aa)
             return _storage[*index];

         throw new Exception("no key");
     }
}

immutable struct S
{
     int num;
}

void main()
{
     import std.stdio : writeln;

     auto aa = new AA!(string, S);

     aa["one"] = S(1);
     aa["two"] = S(2);

     writeln(aa["one"]);
     writeln(aa["two"]);
}



More information about the Digitalmars-d-learn mailing list