Kinds of containers

Timon Gehr via Digitalmars-d digitalmars-d at puremagic.com
Wed Oct 21 08:08:14 PDT 2015


On 10/21/2015 04:36 PM, Andrei Alexandrescu wrote:
> On 10/21/2015 10:21 AM, Timon Gehr wrote:
>>>
>>
>> I still think those should be mutable by default in order to have
>> painless interchangeability with other value type containers. Why should
>> corresponding ephemeral and persistent containers have different
>> interfaces?
>>
>> I assume you envision code using those to look as follows?
>>
>> FunSet!int a;
>> a=a.with_(1);
>> auto b=a;
>> a=a.with_(2);
>> a=a.with_(3);
>> // b = {1}, a={1,2,3};
>>
>> I think this should be allowed too:
>>
>> FunSet!int a;
>> a.insert(1);
>> auto b=a;
>> a.insert(2);
>> a.insert(3);
>> // b = {1}, a={1,2,3};
>>
>> One of the two versions should be automatically implemented via UFCS.
>
> I recall you and I discussed this briefly in the past, but forgot the
> conclusion.
> ...

IIRC the conclusion was postponed. :-)

> So are you saying that a.insert(1) is really rebinding a to be its
> former value plus a new slot? I.e a.insert(1) is the same as a =
> a.with_(1)? That would work, but only if former reads of a refer to the
> old data. E.g.:
>
> FunSet!int a;
> auto b = a;
> assert(a.empty && b.empty);
> a.insert(1);
> assert(!a.empty && b.empty);
>
> Right?
>
>
> Andrei

Exactly. There would be no mutable aliasing. This way, the persistent 
data type can behave like a mutable value type, such as a COW or eager 
copy variant, but with nicer/different performance characteristics. It 
would be great if exchanging different implementation strategies for 
value semantics will be as seamless as possible. (If the initially 
chosen strategy turns out to be wrong, this makes the fix easy.) Of 
course, the implementation of the persistent data structure will be in 
terms of non-mutating and possibly O(1)-COW operations only.




More information about the Digitalmars-d mailing list