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
