Deque impl.

Robert burner Schadek realburner at gmx.de
Thu Jan 31 04:45:19 PST 2013


On 01/31/2013 01:00 PM, monarch_dodra wrote:
> On Thursday, 31 January 2013 at 11:35:31 UTC, d coder wrote:
>> On Thu, Jan 31, 2013 at 2:43 PM, Robert burner Schadek
>> <realburner at gmx.de> wrote:
>>> Thats not totally correct. The Rb tree is a class. But the real 
>>> reason for
>>> the Deque being a class
>>> is that it holds two value members. And if you pass the Deque around 
>>> you
>>> need to do this as ref.
>>> Otherwise you shall not call any method that modifies this value 
>>> members,
>>> because this will only be
>>> visible at the calling site.
>>
>> I would expect all the containers in the std.container to have either
>> pass by value or pass by reference semantics. It seems at least Array,
>> Slist, and Dlist are structs and they follow pass by value semantics.
>>
>>> From Dlang.org:
>>
>> auto a = DList!int([3, 4]); //Create a new chain
>> auto b = a; //Point to the same chain
>> // (3 - 4)
>> assert(a[].equal([3, 4]));
>> assert(b[].equal([3, 4]));
>>
>> b.stableInsertFront(1); //insert before of b
>> b.stableInsertBack(5); //insert after of b
>> // (2 - (3 - 4) - 5)
>> assert(a[].equal([3, 4])); //a is not changed
>> assert(b[].equal([1, 3, 4, 5])); // but b is changed
>>
>>
>> Regards
>> - Puneet
>
> Technically, all containers in std.container need to adhere to 
> reference semantics when passed by value, regardless of if they are 
> classes or structs.
This is how Deque behaves. I could make it a struct and than keep the 
value members on the heap, but I think there is nothing gained by that.
>
> For example, AA's can be considered structs, but when passed, they 
> still adhere to reference semantics.
>
> ---------
> In regards to DList: I wrote that code and documentation.
>
> The truth is that DList was written with absolutely 0 concern to what 
> might happen if you mutate a copy. While correcting the code, I 
> preserved the old semantic (accidental) semantic, which was kind of 
> weird.
>
> The mistake was to document said semantic. It makes no sense. I should 
> never even have preserved that semantic in the first place anyways. 
> There is now a new version in the tubes for Dlist, to make it behave 
> the way you'd expect it to:
>
> https://github.com/D-Programming-Language/phobos/pull/953
>
> The pull is kind of stuck in limbo, specifically because of the 
> problems associated with implementing reference semantics with structs :/
I read the comments to that pull request and really liked the idea of 
the std.container2 by jmdavis. I would be really interested to help with 
the design and impl of this
module. Do any further plans exists on that?



More information about the Digitalmars-d mailing list