Container templates and constancy of elements

Ali Çehreli acehreli at yahoo.com
Wed Mar 14 13:38:02 PDT 2012


On 03/14/2012 12:24 PM, H. S. Teoh wrote:
 > On Wed, Mar 14, 2012 at 06:51:54PM +0000, Stewart Gordon wrote:
 >> With some containers, such as lists and trees (binary search trees
 >> aside), it doesn't matter if the elements can change state, since
 >> the data structure remains well-formed.
 >>
 >> However, with others, such as sets and AAs, it's desirable if the
 >> keys don't mutate.  Any operations on them won't work right if there
 >> are keys in the wrong hash slots or out of order (depending on the
 >> underlying data structure) because they have changed since being put
 >> into the container.  Of course, this doesn't apply to _values_ in an
 >> AA, since these can safely mutate.
 >
 > IMO, AA keys should be *implicitly* immutable. That is, when you declare
 > something like:
 >
 > 	int[ubyte[]] x;
 >
 > then the key type of x should be immutable(ubyte)[], not ubyte[].

Yes, the internally stored copy of the key should be immutable(ubyte[]). 
Please note the difference from yours, but I guess that extra protection 
is just to protect the developers from themselves by avoiding mutating 
the key in the implementation.

But the conceptual key type of the AA should be const(ubyte[]). The 
reason is, a const parameter is welcoming: It says "I accept both 
mutable and immutable as arguments". On the other hand, an immutable 
parameter is restricting: It says "I demand only immutable as argument".

The following opIndex accepts  keys of five different types of immutability:

class SingleElementAA
{
     immutable(uint[]) key;
     int value;

     ref int opIndex(const(uint[]) key)
     {
         return value;
     }
}

void main()
{
     auto aa = new SingleElementAA();

     uint[] mutable;
     immutable(uint)[] element_immutable;
     immutable(uint[]) all_immutable;
     enum uint[] enum_immutable = [ 1 ];

     aa[mutable] = 42;
     aa[element_immutable] = 43;
     aa[all_immutable] = 44;
     aa[enum_immutable] = 45;
     aa[[0, 1]] = 42;          // literal key
}

Ali



More information about the Digitalmars-d mailing list