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