assumeSafeAppend inconsistent when multiple slices in use
simendsjo
simen.endsjo at pandavre.com
Tue Apr 5 12:24:46 PDT 2011
I don't know if this is an actual problem, but I don't understand the
behavior.
When one slice calls assumeSafeAppend, both slices is "given control",
that is, gets the parents capacity.
It's best explained with an example:
int[] a;
a.length = 4;
int[] b = a[0..1];
int[] c = a[0..1];
// appending to b or c reallocates
assert(a.capacity > 0);
assert(b.capacity == 0);
assert(c.capacity == 0);
// gives a's capacity to b AND c
b.assumeSafeAppend();
assert(a.capacity == 0);
assert(b.capacity > 0);
assert(c.capacity > 0); // why does c get capacity?
// .. until one of the slices modifies. Just changing
assumeSafeAppend does not change this behavior
b ~= 1;
// now b has full control
assert(a.capacity == 0);
assert(b.capacity > 0);
assert(c.capacity == 0);
// c full control
c.assumeSafeAppend();
assert(a.capacity == 0);
assert(b.capacity == 0);
assert(c.capacity > 0);
// a full control
a.assumeSafeAppend();
assert(a.capacity > 0);
assert(b.capacity == 0);
assert(c.capacity == 0);
// but now ONLY b gets full control. Not both b and c as the
first assumeSafeAppend
b.assumeSafeAppend();
assert(a.capacity == 0);
assert(b.capacity > 0);
assert(c.capacity == 0);
More information about the Digitalmars-d-learn
mailing list