From f7615efb642303cdfe2dff14416b1ee9bab2c4f9 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Wed, 12 Aug 2020 16:51:54 +0200 Subject: Elemente an beiden Enden der Queue hinzufügen/entfernen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ringbuff.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 9 deletions(-) diff --git a/ringbuff.c b/ringbuff.c index e101073..47d4cbf 100644 --- a/ringbuff.c +++ b/ringbuff.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -18,7 +19,21 @@ ring_init(struct ring_buffer *rb) } bool -ring_put(struct ring_buffer *rb, T data) +ring_push_front(struct ring_buffer *rb, T data) +{ + const size_t prev = (rb->tail + NELEM(rb->array) - 1) % NELEM(rb->array); + + if ( prev == rb->head ) + return false; + + rb->array[prev] = data; + rb->tail = prev; + + return true; +} + +bool +ring_push_back(struct ring_buffer *rb, T data) { const size_t next = (rb->head + 1) % NELEM(rb->array); @@ -32,7 +47,7 @@ ring_put(struct ring_buffer *rb, T data) } bool -ring_get(struct ring_buffer *rb, T *data) +ring_pop_front(struct ring_buffer *rb, T *data) { if ( rb->head == rb->tail ) return false; @@ -45,12 +60,32 @@ ring_get(struct ring_buffer *rb, T *data) return true; } +bool +ring_pop_back(struct ring_buffer *rb, T *data) +{ + if ( rb->head == rb->tail ) + return false; + + const size_t prev = (rb->head + NELEM(rb->array) - 1) % NELEM(rb->array); + + *data = rb->array[prev]; + rb->head = prev; + + return true; +} + void f() { ERROR(""); } +void +debug_print(const char *msg, struct ring_buffer *rb) +{ + printf("%s: head: %zu, tail: %zu\n", msg, rb->head, rb->tail); +} + int main(void) { @@ -61,15 +96,35 @@ main(void) struct ring_buffer rb = { .head = 0, .tail = 0 }; #endif - for ( int i = 0; i != 30; ++i ) { - if ( !ring_put(&rb, i) ) - break; - } + assert(ring_push_back(&rb, 1) == true); // 1 + assert(ring_push_back(&rb, 2) == true); // 1, 2 + assert(ring_push_back(&rb, 3) == true); // 1, 2, 3 + assert(ring_push_back(&rb, 4) == true); // 1, 2, 3, 4 - int j; - while ( ring_get(&rb, &j) ) { - printf("%d\n", j); + debug_print("Stand", &rb); + + assert(ring_push_front(&rb, 0) == true); // 0, 1, 2, 3, 4 + assert(ring_push_front(&rb, -1) == true); // -1, 0, 1, 2, 3, 4 + + debug_print("Stand", &rb); + + T temp; + assert(ring_pop_back(&rb, &temp) == true); // -1, 0, 1, 2, 3 + assert(ring_pop_front(&rb, &temp) == true); // 0, 1, 2, 3 + + debug_print("Stand", &rb); + + assert(ring_push_back(&rb, 4) == true); // 0, 1, 2, 3, 4 + assert(ring_push_back(&rb, 5) == true); // 0, 1, 2, 3, 4, 5 + assert(ring_push_back(&rb, 6) == true); // 0, 1, 2, 3, 4, 5, 6 + assert(ring_push_back(&rb, 7) == false); // 0, 1, 2, 3, 4, 5, 6 + assert(ring_push_front(&rb, 7) == false); // 0, 1, 2, 3, 4, 5, 6 + + while ( ring_pop_back(&rb, &temp) ) { + printf("temp: %d\n", temp); } + debug_print("Stand", &rb); + return EXIT_SUCCESS; } -- cgit v1.3