making COW and ownership
Era Scarecrow
rtcvb32 at yahoo.com
Tue Nov 20 20:23:49 PST 2012
I was thinking briefly and glancing over documentation regarding
cluts and non-cluts (Reference vs value types), and considering
my BitArray implementation. I was having a problem trying to
solve how to avoid duplicating it unless it actually was needed;
And I've come to a possible solution.
There are data types that must have new copies, but what if we
delay the duplicating unless it actually tries to make a change.
Mind you this won't be usable in all cases; But if we can put an
ownership tag on it, perhaps it might do a good portion of the
job.
Here's a quick thrown together example of what I'm talking about.
[code]
import std.stdio;
import std.conv;
struct COWArray(T) {
COWArray *owner;
T[] data;
this(int i) {
owner = &this;
data.length = i;
}
inout(T) opIndex(int i) inout pure nothrow {
return data[i];
}
ref COWArray opIndexAssign(T value, int i) pure {
if (owner != &this) {
owner = &this;
data = data.dup;
}
data[i] = value;
return this;
}
}
unittest {
auto ca = COWArray!int(4);
writeln("\nOriginal:");
foreach(i; 0 .. 4) {
ca[i] = 10 + i;
writeln(ca);
}
auto new_ca = ca;
writeln("\nNew section: ");
foreach(i; 0 .. 4) {
new_ca[i] = 200 + i;
writeln(new_ca);
}
writeln("\nPost processing:");
writeln(ca);
writeln(new_ca);
}
[/code]
This produces:
Original:
COWArray!(int)(18FDCC, [10, 0, 0, 0])
COWArray!(int)(18FDCC, [10, 11, 0, 0])
COWArray!(int)(18FDCC, [10, 11, 12, 0])
COWArray!(int)(18FDCC, [10, 11, 12, 13])
New section:
COWArray!(int)(18FDE4, [200, 11, 12, 13])
COWArray!(int)(18FDE4, [200, 201, 12, 13])
COWArray!(int)(18FDE4, [200, 201, 202, 13])
COWArray!(int)(18FDE4, [200, 201, 202, 203])
Post processing:
COWArray!(int)(18FDCC, [10, 11, 12, 13])
COWArray!(int)(18FDE4, [200, 201, 202, 203])
More information about the Digitalmars-d-learn
mailing list