]> git.lizzy.rs Git - nothing.git/blob - src/ring_buffer.c
Merge pull request #1255 from tsoding/1253
[nothing.git] / src / ring_buffer.c
1 #include "ring_buffer.h"
2 #include "system/stacktrace.h"
3
4 void ring_buffer_push(RingBuffer *buffer,
5                       void *element)
6 {
7     trace_assert(buffer);
8     trace_assert(element);
9
10     size_t i = (buffer->begin + buffer->count) % buffer->capacity;
11
12     if (buffer->count < buffer->capacity) {
13         memcpy(
14             buffer->data + i * buffer->element_size,
15             element,
16             buffer->element_size);
17         buffer->count += 1;
18     } else {
19         memcpy(
20             buffer->data + i * buffer->element_size,
21             element,
22             buffer->element_size);
23         buffer->begin = (buffer->begin + 1) % buffer->capacity;
24     }
25 }
26
27 int ring_buffer_pop(RingBuffer *buffer)
28 {
29     trace_assert(buffer);
30
31     if (buffer->count == 0) return 0;
32     buffer->count--;
33
34     return 1;
35 }
36
37 void *ring_buffer_top(RingBuffer *buffer)
38 {
39     trace_assert(buffer);
40     if (buffer->count == 0) return NULL;
41     size_t i = (buffer->begin + buffer->count - 1) % buffer->capacity;
42     return buffer->data + i * buffer->element_size;
43 }