How do I store an immutable value into a mutable associative array?

PlatisYialos leonidasklados at gmail.com
Tue Nov 6 11:24:55 PST 2012


On Tuesday, 6 November 2012 at 18:25:46 UTC, Ali Çehreli wrote:
> On 11/06/2012 09:48 AM, PlatisYialos wrote:
>> On Tuesday, 6 November 2012 at 17:23:41 UTC, PlatisYialos 
>> wrote:
>>
>> Errmm! Here's a better example, but with the same results:
>>
>> ----------------------------
>> module test;
>>
>> void noparens() {
>> immutable char[char] aMap;
>> char a = 'a';
>> immutable char b = 'b';
>> aMap[a] = b;
>> }
>>
>> void withparens() {
>> immutable(char)[char] aMap;
>> char a = 'a';
>> immutable char b = 'b';
>> aMap[a] = b;
>> }
>> -----------------------------
>>
>
> I think it is not surprising why noparens() doesn't work: aMap 
> is immutable.
>
> withparens() would be expected to work but again, 'aMap[a] = b' 
> is seen as a mutation of element aMap[a]. If associative arrays 
> had an insert() function, then we would expect it to work.
>
> Here is a quick solution:
>
> /* I used 'inout' to accept mutable, const, and immutable value 
> types */
> void insert(K, V)(ref immutable(V)[K] aa, K key, inout V value)
> {
>     /* I would like to use the following simpler code:
>      *
>      *     auto mutable = cast(V[K])aa;
>      *     mutable[key] = value;
>      *
>      * It did not work when 'aa' was null. The later 
> initialization of
>      * 'mutable ' would affect only 'mutable', not 'aa'.
>      */
>     V[K] * mutable = cast(V[K]*)&aa;
>     (*mutable)[key] = value;
> }
>
> // ...
>
>   aMap.insert(a, b);
>
> Ali

Thank you, Ali, for going above and beyond on this one!



More information about the Digitalmars-d-learn mailing list