Taking a copy of an object

Derek derek at psyc.ward
Thu Aug 3 15:46:00 PDT 2006


On Thu, 03 Aug 2006 14:26:08 +0100, Bruno Medeiros wrote:

> Derek Parnell wrote:
>> Currently there doesn't seem to be any standard D mechanism (read:
>> operator) to take a copy of an object. So are there any suggestions for a
>> name that we can all agree on; one that might become an unofficial
>> standard? 
>> 
>> For arrays we have the 'dup' property but for objects there is nothing that
>> the compiler assumes. I'm partial to 'onDup' or 'onCopy', and maybe even a
>> 'onDeepCopy' as an additional function.
>> 
>> Example:
>> 
>>   class Foo
>>   {
>>       int x;
>>       Bar b;
>> 
>>       this(int y) 
>>       {
>>            x = y;
>>            b = new Bar(y);
>>       }
>> 
>>       Foo onCopy()
>>       {
>>           Foo t;
>>           t = new Foo(x);
>>           return t;
>>        }
>>    }
>> 
>>    . . . 
>> 
>>    auto backup = q.onCopy();
>> 
> 
> What's the "on" prefix for? I think the name should be something like:

The 'on' prefix is a *hint* to Walter that I'd really like this function to
be invoked via a new operator and not necessariliy called directly.

> dup()
> Clone()
> Copy()
> and it should exist by default in the Object class, with a default 
> implementation that does a shallow copy.

Yes, a default shallow copy defined in Object would be a good idea. In that
case an operator would not be needed for shallow copying.

> Also, it is redundant to specify a shallow copy function for each class: 
> the code is the same for any class. It is something like:
>    Object ShallowCopy(Object obj) {
>      int len = obj.classinfo.init.length;
>      auto data = (cast(ubyte*) obj)[0..len];
>      return cast(Object) data.dup.ptr;
>    }
> So there should not be two different functions for each kind of copy, 
> there should be only one, which conceptually is defined to do a deep copy.

Not sure I agree here. The shallow copy coulod be generic as you
demonstrated, but a deep copy is very Object-specific and would need to be
defined in the class that needed it. 


-- 
Derek Parnell
Melbourne, Australia
"Down with mediocrity!"



More information about the Digitalmars-d mailing list