Variable-length stack allocated arrays

Rainer Deyke rainerd at eldwood.com
Tue Jan 12 16:48:20 PST 2010


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

template SuperStack(T) {
    private T[][] buffers;

    T[] getBuffer(size_t n) {
        if (buffers.length == 0) {
            buffers.length = 1;
            buffers[0].length = n;
            return buffers[0];
        } else if (gc.capacity(buffers[$ - 1]) < buffers.length + n) {
            buffers.length = buffers.length + 1;
            // Prealloacte space, then truncate.
            buffers[$ - 1].length = max(buffers[$ - 2].length, n);
            buffers[$ - 1].length = n;
            return buffers[$ - 1];
        } else {
            buffers[$ - 1].length = buffers[$ - 1].length + n;
            return buffers[$ - 1][$ - n .. $];
        }
    }

    void releaseBuffer(T[] b) {
        enforce(b is buffers[$ - 1][$ - b.length .. $]);
        buffers[$ - 1].length = buffer[$ - 1].length - b.length;
        if (buffers[$ - 1].length == 0) {
            buffers.length = buffers.length - 1;
        }
    }
}

-- 
Rainer Deyke - rainerd at eldwood.com



More information about the Digitalmars-d mailing list