From eedb2c3c5286a10ba059640ca84a34c488186e37 Mon Sep 17 00:00:00 2001 From: Pierre Curto Date: Fri, 25 Aug 2023 12:48:53 +0200 Subject: [PATCH] std/collections: add RingBuffer.popc() Signed-off-by: Pierre Curto --- lib/std/collections/ringbuffer.c3 | 15 +++++++++++++++ test/unit/stdlib/collections/ringbuffer.c3 | 5 ++++- 2 files changed, 19 insertions(+), 1 deletion(-) 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