1
1
#include "RingBuffer.h"
4
#define err_on_full(S) {\
5
if (self->len >= S->size) {\
7
s_err_print ("Buffer full. Needs to be reallocated.\n"\
8
" (This is not done automatically. Returning.)");\
13
#define err_seems_full() {\
14
s_err_print ("Array seems to be full... Returning.");\
19
#define nothing_to_ret() {\
20
s_warn_print ("Ring buffer is empty, nothing to return");\
4
25
struct SRingBuffer {
33
56
s_ring_buffer_is_empty (SRingBuffer * self) {
34
return (self->start == self->end);
57
return ((self->start == self->end) && self->len == 0 );
38
61
s_ring_buffer_push (SRingBuffer * self,
67
if (self->end <= self->size) {
68
self->end = self->end + 1;
69
} else if (self->end == self->size) {
70
if (self->start == 0) {
75
} else if (self->end < self->start) {
76
if ((self->end + 1) == self->start ) {
79
self->end = self->end + 1;
82
s_err_print ("Reaching a place that should not be reached. Returning");
86
self->len = self->len + 1;
87
self->array[self->end] = data;
43
s_ring_buffer_push_back (SRingBuffer * self,
48
s_ring_buffer_pop (SRingBuffer * self);
52
s_ring_buffer_pop_back (SRingBuffer * self);
92
s_ring_buffer_push_front (SRingBuffer * self,
98
if ((self->start - 1) < 0) {
99
if (self->end == self->size) {
102
self->start = self->size;
104
} else if (self->start <= self-end) {
105
self->start = self->start - 1;
106
} else if (self->start > self->end) {
107
if ((self->start - 1) == self->end ) {
110
self->start = self->start - 1;
113
s_err_print ("Reaching a place that should not be reached. Returning");
117
self->len = self->len + 1;
118
self->array[self->start] = data;
122
* When doing poping we do not override the data in the buffer.
123
* This to alleviate some prosessing time form usage of the data structure.
126
s_ring_buffer_pop (SRingBuffer * self, sboolean * err) {
127
if (s_ring_buffer_is_empty (self)) {
131
sbyte ret_val = self->array[self->end];
132
self->len = self->len - 1;
133
self->end = self->end - 1;
139
s_ring_buffer_pop_front (SRingBuffer * self, sboolean * err) {
140
if (s_ring_buffer_is_empty (self)) {
144
sbyte ret_val = self->array[self->start];
145
self->start = self->start + 1;
146
self->len = self->len - 1;
152
s_ring_buffer_peek (SRingBuffer * self, sboolean * err) {
153
if (s_ring_buffer_is_empty (self)) {
157
return self->array[self->end];
161
s_ring_buffer_peek_front (SRingBuffer * self, sboolean * err) {
162
if (s_ring_buffer_is_empty (self)) {
166
return self->array[self->start];
56
170
s_ring_buffer_realloc (SRingBuffer * self,
61
s_ring_buffer_len (SRingBuffer * self);
65
s_ring_buffer_size (SRingBuffer * self);
176
s_ring_buffer_len (SRingBuffer * self) {
182
s_ring_buffer_size (SRingBuffer * self) {
69
188
s_ring_buffer_for_each (SRingBuffer * self,