On Wednesday, 4 March 2015 at 08:56:20 UTC, Ivan Timokhin wrote:
Excuse me if I miss something obvious, but:

    void main()
    {
        auto arr = RCArray!int([0]);
        foo(arr, arr[0]);
    }

    void foo(ref RCArray!int arr, ref int val)
    {
        {
auto copy = arr; //arr's (and copy's) reference counts are both 2 arr = RCArray!int([]); // There is another owner, so arr // forgets about the old payload } // Last owner of the array ('copy') gets destroyed and happily
          // frees the payload.
        val = 3; // Oops.
    }




struct PileInfo         "Red"         TOP of PILE
{
        int refCount;
        RCDataBlock * top;
        RCDataBlock * bottom;
}

struct RCDataBlock      "Blue"        
{
        PileInfo * pileInfo;
        RCDataBlock * next;
        Array * payload;        //Actual Data.
}

struct RCArray
{
        RCDataBlock * block;
}


RCArray a,b,c,d;        //all different piles

a = b;
b = c;
d = a;                  //makes them one single pile.


What if you pile them up. Blue cubes which contain the data.
And a Red cube containing the reference count equal to
the sum of all references to the blue cube of the same pile.
Basically a pile of blue cubes with a red cube on top.



1) RCArray a,b,c,d;             //------------

[1]
 x <-a

[1]
 x <-b

[1]
 x <-c

[1]
 x <-d


2) a = b;       //------------

[2]
 x <-[old b1]
 x <-a,b

[1]
 x <-c

[1]
 x <-d

3) b = c;       //------------


[3]
 x <-b,c
 x <-[old b1]
 x <-a,[old b2]

[1]
 x <-d


4) d=a;         //------------

[4]
 x <-b,c
 x <-[old b1]
 x <-[old a1],[old b2]
 x <-d,a



Reply via email to