aboutsummaryrefslogtreecommitdiff
path: root/ringbuff.c
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2020-08-12 16:51:54 +0200
committerThomas Schmucker <ts@its1.de>2020-08-12 16:51:54 +0200
commitf7615efb642303cdfe2dff14416b1ee9bab2c4f9 (patch)
treebab263df434faeccaeeecc91ccb3cb7fb4924442 /ringbuff.c
parent6047f281c84b2552cdb056d510834468028b075d (diff)
downloaddata-structures-f7615efb642303cdfe2dff14416b1ee9bab2c4f9.tar.gz
data-structures-f7615efb642303cdfe2dff14416b1ee9bab2c4f9.tar.bz2
data-structures-f7615efb642303cdfe2dff14416b1ee9bab2c4f9.zip
Elemente an beiden Enden der Queue hinzufügen/entfernen
Diffstat (limited to 'ringbuff.c')
-rw-r--r--ringbuff.c73
1 files 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 @@
1#include <assert.h>
1#include <stdbool.h> 2#include <stdbool.h>
2#include <stdio.h> 3#include <stdio.h>
3#include <stdlib.h> 4#include <stdlib.h>
@@ -18,7 +19,21 @@ ring_init(struct ring_buffer *rb)
18} 19}
19 20
20bool 21bool
21ring_put(struct ring_buffer *rb, T data) 22ring_push_front(struct ring_buffer *rb, T data)
23{
24 const size_t prev = (rb->tail + NELEM(rb->array) - 1) % NELEM(rb->array);
25
26 if ( prev == rb->head )
27 return false;
28
29 rb->array[prev] = data;
30 rb->tail = prev;
31
32 return true;
33}
34
35bool
36ring_push_back(struct ring_buffer *rb, T data)
22{ 37{
23 const size_t next = (rb->head + 1) % NELEM(rb->array); 38 const size_t next = (rb->head + 1) % NELEM(rb->array);
24 39
@@ -32,7 +47,7 @@ ring_put(struct ring_buffer *rb, T data)
32} 47}
33 48
34bool 49bool
35ring_get(struct ring_buffer *rb, T *data) 50ring_pop_front(struct ring_buffer *rb, T *data)
36{ 51{
37 if ( rb->head == rb->tail ) 52 if ( rb->head == rb->tail )
38 return false; 53 return false;
@@ -45,12 +60,32 @@ ring_get(struct ring_buffer *rb, T *data)
45 return true; 60 return true;
46} 61}
47 62
63bool
64ring_pop_back(struct ring_buffer *rb, T *data)
65{
66 if ( rb->head == rb->tail )
67 return false;
68
69 const size_t prev = (rb->head + NELEM(rb->array) - 1) % NELEM(rb->array);
70
71 *data = rb->array[prev];
72 rb->head = prev;
73
74 return true;
75}
76
48void 77void
49f() 78f()
50{ 79{
51 ERROR(""); 80 ERROR("");
52} 81}
53 82
83void
84debug_print(const char *msg, struct ring_buffer *rb)
85{
86 printf("%s: head: %zu, tail: %zu\n", msg, rb->head, rb->tail);
87}
88
54int 89int
55main(void) 90main(void)
56{ 91{
@@ -61,15 +96,35 @@ main(void)
61 struct ring_buffer rb = { .head = 0, .tail = 0 }; 96 struct ring_buffer rb = { .head = 0, .tail = 0 };
62#endif 97#endif
63 98
64 for ( int i = 0; i != 30; ++i ) { 99 assert(ring_push_back(&rb, 1) == true); // 1
65 if ( !ring_put(&rb, i) ) 100 assert(ring_push_back(&rb, 2) == true); // 1, 2
66 break; 101 assert(ring_push_back(&rb, 3) == true); // 1, 2, 3
67 } 102 assert(ring_push_back(&rb, 4) == true); // 1, 2, 3, 4
68 103
69 int j; 104 debug_print("Stand", &rb);
70 while ( ring_get(&rb, &j) ) { 105
71 printf("%d\n", j); 106 assert(ring_push_front(&rb, 0) == true); // 0, 1, 2, 3, 4
107 assert(ring_push_front(&rb, -1) == true); // -1, 0, 1, 2, 3, 4
108
109 debug_print("Stand", &rb);
110
111 T temp;
112 assert(ring_pop_back(&rb, &temp) == true); // -1, 0, 1, 2, 3
113 assert(ring_pop_front(&rb, &temp) == true); // 0, 1, 2, 3
114
115 debug_print("Stand", &rb);
116
117 assert(ring_push_back(&rb, 4) == true); // 0, 1, 2, 3, 4
118 assert(ring_push_back(&rb, 5) == true); // 0, 1, 2, 3, 4, 5
119 assert(ring_push_back(&rb, 6) == true); // 0, 1, 2, 3, 4, 5, 6
120 assert(ring_push_back(&rb, 7) == false); // 0, 1, 2, 3, 4, 5, 6
121 assert(ring_push_front(&rb, 7) == false); // 0, 1, 2, 3, 4, 5, 6
122
123 while ( ring_pop_back(&rb, &temp) ) {
124 printf("temp: %d\n", temp);
72 } 125 }
73 126
127 debug_print("Stand", &rb);
128
74 return EXIT_SUCCESS; 129 return EXIT_SUCCESS;
75} 130}