Problem with associative arrays

Ali Çehreli acehreli at yahoo.com
Sat Mar 19 11:12:49 PDT 2011


On 03/19/2011 10:05 AM, Mafi wrote:
 > Am 19.03.2011 17:29, schrieb Piotr Szturmaj:
 >> Shouldn't dynamic array be reference type?

 > Just one note: appending (ar ~= 1) differs from concating (ar = ar ~ 1)
 > that while the second is guanranteed to reallocate, about the first you
 > can't be sure. It depends on the GC.

On the other hand, if the dynamic array is sharing a part of another 
array, extending the dynamic array always breaks the sharing and the 
dynamic array is always relocated.

void main()
{
     int[] a = [ 100, 200, 300 ];

     // Three slices (aka dynamic arrays) to the first two elements
     int[] s0 = a[0..2];
     int[] s1 = a[0..2];
     int[] s2 = a[0..2];

     // They share the same first two elements
     assert(s0.ptr == a.ptr);
     assert(s1.ptr == a.ptr);
     assert(s2.ptr == a.ptr);

     // All of these operations break the sharing
     ++s0.length;
     s1 ~= 42;
     s2 = s2 ~ 43;

     // Nothing happened to the original
     assert(a == [ 100, 200, 300 ]);

     // Because nobody is sharing anymore
     assert(s0.ptr != a.ptr);
     assert(s1.ptr != a.ptr);
     assert(s1.ptr != s0.ptr);
     assert(s2.ptr != a.ptr);
     assert(s2.ptr != s0.ptr);
     assert(s2.ptr != s1.ptr);
}

I forgot the name of the feature. Basically, no slice (aka dynamic 
array) can extend into other elements and starts sharing them.

Ali



More information about the Digitalmars-d-learn mailing list