]> git.lizzy.rs Git - nothing.git/blob - src/ring_buffer.c
905d1773637eb2a130417108d5cf5fe27868e538
[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         if (buffer->dtor) buffer->dtor(buffer->data + i * buffer->element_size);
20         memcpy(
21             buffer->data + i * buffer->element_size,
22             element,
23             buffer->element_size);
24         buffer->begin = (buffer->begin + 1) % buffer->capacity;
25     }
26 }
27
28 int ring_buffer_pop(RingBuffer *buffer)
29 {
30     trace_assert(buffer);
31
32     if (buffer->count == 0) return 0;
33
34     if (buffer->dtor) {
35         size_t i = (buffer->begin + buffer->count - 1) % buffer->capacity;
36         buffer->dtor(buffer->data + i * buffer->element_size);
37     }
38
39     buffer->count--;
40
41     return 1;
42 }
43
44 void *ring_buffer_top(RingBuffer *buffer)
45 {
46     trace_assert(buffer);
47     if (buffer->count == 0) return NULL;
48     size_t i = (buffer->begin + buffer->count - 1) % buffer->capacity;
49     return buffer->data + i * buffer->element_size;
50 }