diff --git a/lib/std/collections/ringbuffer.c3 b/lib/std/collections/ringbuffer.c3 index 45fa28a6f..507dd9116 100644 --- a/lib/std/collections/ringbuffer.c3 +++ b/lib/std/collections/ringbuffer.c3 @@ -37,6 +37,21 @@ fn Type RingBuffer.getc(&self, usz index) return self.buf[index - avail]; } +fn Type! RingBuffer.popc(&self) +{ + switch + { + case self.written == 0: + return SearchResult.MISSING?; + case self.written < SIZE: + self.written--; + return self.buf[self.written]; + default: + self.head = (self.head - 1) % SIZE; + return self.buf[self.head]; + } +} + fn usz RingBuffer.get(&self, usz index, Type[] buffer) { index %= SIZE; diff --git a/test/unit/stdlib/collections/ringbuffer.c3 b/test/unit/stdlib/collections/ringbuffer.c3 index cd6b8c047..158c732e7 100644 --- a/test/unit/stdlib/collections/ringbuffer.c3 +++ b/test/unit/stdlib/collections/ringbuffer.c3 @@ -4,7 +4,7 @@ import std::io; def Buffer = RingBuffer(); -fn void putc_getc() +fn void! putc_getc() { Buffer rb; rb.init(); @@ -23,4 +23,7 @@ fn void putc_getc() assert(rb.getc(1) == 3); assert(rb.getc(2) == 4); assert(rb.getc(3) == 5); + + char c = rb.popc()!; + assert(c == 5); } \ No newline at end of file