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);

Reply via email to