Ring buffer stores the bufferSize most recent elements.
import std.algorithm; auto buffer = RingBuffer!int(5); buffer.pushFront(1); buffer.pushFront(2); buffer.pushFront(3); buffer.pushFront(4); buffer.pushFront(5); assert(buffer.front == 5); assert(equal(buffer, [5, 4, 3, 2, 1])); buffer.pushFront(6); assert(buffer.front == 6); assert(equal(buffer, [6, 5, 4, 3, 2]));
Ring buffer may have a static size.
import std.algorithm; auto buffer = RingBuffer!(int, 5)(); buffer.pushFront(1); buffer.pushFront(2); buffer.pushFront(3); buffer.pushFront(4); buffer.pushFront(5); assert(buffer.front == 5); assert(equal(buffer, [5, 4, 3, 2, 1])); buffer.pushFront(6); assert(buffer.front == 6); assert(equal(buffer, [6, 5, 4, 3, 2]));
Elements can be removed.
import std.algorithm; auto buffer = RingBuffer!int(5); buffer.pushFront(1); buffer.pushFront(2); buffer.pushFront(3); buffer.pushFront(4); buffer.pushFront(5); assert(buffer.length == 5); assert(equal(buffer, [5, 4, 3, 2, 1])); buffer.popFront(); buffer.popBack(); assert(buffer.length == 3); assert(equal(buffer, [4, 3, 2]));
The buffer is double-ended.
import std.algorithm; auto buffer = RingBuffer!int(5); buffer.pushFront(1); buffer.pushFront(2); buffer.pushFront(3); buffer.pushFront(4); buffer.pushFront(5); buffer.pushFront(6); assert(buffer.front == 6); assert(buffer.back == 2); assert(equal(buffer, [6, 5, 4, 3, 2])); buffer.pushBack(1); assert(buffer.front == 5); assert(buffer.back == 1); assert(equal(buffer, [5, 4, 3, 2, 1]));
The buffer can be used as an output range.
import std.algorithm; import std.range; auto buffer = RingBuffer!int(32); iota(8).copy(&buffer); assert(buffer.front == 0); buffer.popFront(); assert(buffer.front == 1); buffer.popFront(); assert(equal(buffer, iota(2, 8)));
The size of the underlying array may be increased.
import std.algorithm; auto buffer = RingBuffer!int(5); buffer.pushBack(1); // [1] buffer.pushBack(2); // [1, 2] buffer.pushBack(3); // [1, 2, 3] buffer.pushBack(4); // [1, 2, 3, 4] buffer.pushBack(5); // [1, 2, 3, 4, 5] // elements are no longer linear in memory buffer.pushBack(6); // [2, 3, 4, 5, 6] assert(buffer.capacity == 5); buffer.reserve(10); assert(equal(buffer, [2, 3, 4, 5, 6]));
An array-based implementation of a ring buffer.