diff options
Diffstat (limited to 'ringbuff.c')
| -rw-r--r-- | ringbuff.c | 73 |
1 files changed, 64 insertions, 9 deletions
| @@ -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 | ||
| 20 | bool | 21 | bool |
| 21 | ring_put(struct ring_buffer *rb, T data) | 22 | ring_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 | |||
| 35 | bool | ||
| 36 | ring_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 | ||
| 34 | bool | 49 | bool |
| 35 | ring_get(struct ring_buffer *rb, T *data) | 50 | ring_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 | ||
| 63 | bool | ||
| 64 | ring_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 | |||
| 48 | void | 77 | void |
| 49 | f() | 78 | f() |
| 50 | { | 79 | { |
| 51 | ERROR(""); | 80 | ERROR(""); |
| 52 | } | 81 | } |
| 53 | 82 | ||
| 83 | void | ||
| 84 | debug_print(const char *msg, struct ring_buffer *rb) | ||
| 85 | { | ||
| 86 | printf("%s: head: %zu, tail: %zu\n", msg, rb->head, rb->tail); | ||
| 87 | } | ||
| 88 | |||
| 54 | int | 89 | int |
| 55 | main(void) | 90 | main(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 | } |
