aboutsummaryrefslogtreecommitdiff
path: root/ringbuff.c
diff options
context:
space:
mode:
Diffstat (limited to 'ringbuff.c')
-rw-r--r--ringbuff.c156
1 files changed, 0 insertions, 156 deletions
diff --git a/ringbuff.c b/ringbuff.c
deleted file mode 100644
index 1294b3b..0000000
--- a/ringbuff.c
+++ /dev/null
@@ -1,156 +0,0 @@
1#include <assert.h>
2#include <stdbool.h>
3#include <stdio.h>
4#include <stdlib.h>
5
6#include "util.h"
7
8/* --8<-- ring_type */
9typedef int T;
10
11struct ring_buffer {
12 size_t head, tail;
13 T array[8]; /* fit for your needs... */
14};
15/* -->8-- */
16
17/* --8<-- ring_init */
18void
19ring_init(struct ring_buffer *rb)
20{
21 rb->head = rb->tail = 0;
22}
23/* -->8-- */
24
25/* --8<-- ring_push_front */
26bool
27ring_push_front(struct ring_buffer *rb, T data)
28{
29 const size_t prev = (rb->tail + NELEM(rb->array) - 1) % NELEM(rb->array);
30
31 if ( prev == rb->head ) {
32 return false;
33 }
34
35 rb->array[prev] = data;
36 rb->tail = prev;
37
38 return true;
39}
40/* -->8-- */
41
42/* --8<-- ring_push_back */
43bool
44ring_push_back(struct ring_buffer *rb, T data)
45{
46 const size_t next = (rb->head + 1) % NELEM(rb->array);
47
48 if ( next == rb->tail ) {
49 return false;
50 }
51
52 rb->array[rb->head] = data;
53 rb->head = next;
54
55 return true;
56}
57/* -->8-- */
58
59/* --8<-- ring_pop_front */
60bool
61ring_pop_front(struct ring_buffer *rb, T *data)
62{
63 if ( rb->head == rb->tail ) {
64 return false;
65 }
66
67 const size_t next = (rb->tail + 1) % NELEM(rb->array);
68
69 *data = rb->array[rb->tail];
70 rb->tail = next;
71
72 return true;
73}
74/* -->8-- */
75
76/* --8<-- ring_pop_back */
77bool
78ring_pop_back(struct ring_buffer *rb, T *data)
79{
80 if ( rb->head == rb->tail ) {
81 return false;
82 }
83
84 const size_t prev = (rb->head + NELEM(rb->array) - 1) % NELEM(rb->array);
85
86 *data = rb->array[prev];
87 rb->head = prev;
88
89 return true;
90}
91/* -->8-- */
92
93/* --8<-- ring_put */
94bool
95ring_put(struct ring_buffer *rb, T data)
96{
97 return ring_push_back(rb, data);
98}
99/* -->8-- */
100
101/* --8<-- ring_get */
102bool
103ring_get(struct ring_buffer *rb, T *data)
104{
105 return ring_pop_front(rb, data);
106}
107/* -->8-- */
108
109void
110debug_print(const char *msg, struct ring_buffer *rb)
111{
112 printf("%s: head: %zu, tail: %zu\n", msg, rb->head, rb->tail);
113}
114
115int
116main(void)
117{
118#if 0
119 struct ring_buffer rb;
120 ring_init(&rb);
121#else
122 struct ring_buffer rb = { .head = 0, .tail = 0 };
123#endif
124
125 assert(ring_push_back(&rb, 1) == true); // 1
126 assert(ring_push_back(&rb, 2) == true); // 1, 2
127 assert(ring_push_back(&rb, 3) == true); // 1, 2, 3
128 assert(ring_push_back(&rb, 4) == true); // 1, 2, 3, 4
129
130 debug_print("Stand", &rb);
131
132 assert(ring_push_front(&rb, 0) == true); // 0, 1, 2, 3, 4
133 assert(ring_push_front(&rb, -1) == true); // -1, 0, 1, 2, 3, 4
134
135 debug_print("Stand", &rb);
136
137 T temp;
138 assert(ring_pop_back(&rb, &temp) == true); // -1, 0, 1, 2, 3
139 assert(ring_pop_front(&rb, &temp) == true); // 0, 1, 2, 3
140
141 debug_print("Stand", &rb);
142
143 assert(ring_push_back(&rb, 4) == true); // 0, 1, 2, 3, 4
144 assert(ring_push_back(&rb, 5) == true); // 0, 1, 2, 3, 4, 5
145 assert(ring_push_back(&rb, 6) == true); // 0, 1, 2, 3, 4, 5, 6
146 assert(ring_push_back(&rb, 7) == false); // 0, 1, 2, 3, 4, 5, 6
147 assert(ring_push_front(&rb, 7) == false); // 0, 1, 2, 3, 4, 5, 6
148
149 while ( ring_pop_back(&rb, &temp) ) {
150 printf("temp: %d\n", temp);
151 }
152
153 debug_print("Stand", &rb);
154
155 return EXIT_SUCCESS;
156}