Cloning in D

Jacob Carlborg doob at me.com
Mon Sep 6 01:44:37 PDT 2010


On 2010-09-06 05:15, dsimcha wrote:
> I've started playing around with Orange a little to see whether it would meet
> D's cloning needs.  IMHO one must-have feature for proper cloning that truly
> "just works" is full aliasing preservation.  For example, the following code
> modified slightly from the Orange example doesn't work properly:
>
> import orange._; // import the whole library
>
> class A
> {
>      int[] arr1;
>      int[] arr2;
>
>      equals_t opEquals (Object other)
>      {
>          if (auto a = cast(A) other)
>              return a.arr1 == this.arr1&&  a.arr2 == this.arr2;
>
>          return false;
>      }
> }
>
> void main ()
> {
>      auto a = new A; // create something to serialize
>      a.arr1 = [1,2,3,4,5];
>      a.arr2 = a.arr1[1..$];
>
>      auto serializer = new Serializer!(XMLArchive!());
>      auto data = serializer.serialize(a);
>
>      println(data);
>
>      auto a2 = serializer.deserialize!(A)(data);
>      assert(a == a2);
>
>      a2.arr2[0] = 0;
>      println(a2.arr1);  // [1,2,3,4,5]
> }
>
> Note that Orange gets this right for class references that point to the same
> object, but not for arrays that overlap.
>
> A few questions:
>
> 1.  Are most serialization libraries in other languages capable of getting
> this right?
>
> 2.  Do others agree that full aliasing preservation is essential with regard
> to array slices?
>
> 3.  Jacob, do you think you could fix Orange to support this properly?

I can have a look and see what I can do. Could you please report a 
ticket so I don't forget.

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list