Rainer Deyke wrote:
Andrei Alexandrescu wrote:
template SuperStack(T) {
    private T[] buffer;
    private enum slackfactor = 2.5;

    T[] getBuffer(size_t n) {
        buffer.length = buffer.length + n;
        return buffer[$ - n .. $];
    }

    void releaseBuffer(T[] b) {
        enforce(b is buffer[$ - b.length .. $]);
        buffer.length = buffer.length - b.length;
        if (gc.capacity(buffer) > buffer.length * slackfactor) {
            // Reallocate buffer to allow collection of slack
            buffer = buffer.dup;
        }
    }
}

Broken design is broken.

SuperStack!int stack;
auto buffer0 = stack.getBuffer(100);
auto buffer1 = stack.getBuffer(10000000); // Reallocates internal array.
stack.releaseBuffer(buffer1);
stack.releaseBuffer(buffer0); // Assertion failure.

Yikes, thanks. Now something happened with my news reader - the part of your message containing your improved solution got cut off :o).

Andrei

Reply via email to