-
Notifications
You must be signed in to change notification settings - Fork 76
/
ring_buffer.c
43 lines (36 loc) · 1.03 KB
/
ring_buffer.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "ring_buffer.h"
#include "system/stacktrace.h"
void ring_buffer_push(RingBuffer *buffer,
void *element)
{
trace_assert(buffer);
trace_assert(element);
size_t i = (buffer->begin + buffer->count) % buffer->capacity;
if (buffer->count < buffer->capacity) {
memcpy(
buffer->data + i * buffer->element_size,
element,
buffer->element_size);
buffer->count += 1;
} else {
memcpy(
buffer->data + i * buffer->element_size,
element,
buffer->element_size);
buffer->begin = (buffer->begin + 1) % buffer->capacity;
}
}
int ring_buffer_pop(RingBuffer *buffer)
{
trace_assert(buffer);
if (buffer->count == 0) return 0;
buffer->count--;
return 1;
}
void *ring_buffer_top(RingBuffer *buffer)
{
trace_assert(buffer);
if (buffer->count == 0) return NULL;
size_t i = (buffer->begin + buffer->count - 1) % buffer->capacity;
return buffer->data + i * buffer->element_size;
}