]> git.lizzy.rs Git - nothing.git/blob - src/ring_buffer.h
acb86e247852b7927364cf5fcecd333a4bc9b46b
[nothing.git] / src / ring_buffer.h
1 #ifndef RING_BUFFER_H_
2 #define RING_BUFFER_H_
3
4 #include <assert.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <stdint.h>
8 #include <string.h>
9
10 typedef void (*RingBufferDtor)(void *element);
11
12 typedef struct {
13     size_t element_size;
14     size_t capacity;
15     size_t count;
16     size_t begin;
17     uint8_t *data;
18     RingBufferDtor dtor;
19 } RingBuffer;
20
21 static inline
22 RingBuffer create_ring_buffer(size_t element_size,
23                               size_t capacity,
24                               RingBufferDtor dtor)
25 {
26     RingBuffer result = {0};
27     result.element_size = element_size;
28     result.capacity = capacity;
29     result.dtor = dtor;
30     result.data = malloc(result.element_size * result.capacity);
31     return result;
32 }
33
34 static inline
35 void destroy_ring_buffer(RingBuffer buffer)
36 {
37     free(buffer.data);
38 }
39
40 void ring_buffer_push(RingBuffer *buffer, void *element);
41 int ring_buffer_pop(RingBuffer *buffer);
42 void *ring_buffer_top(RingBuffer *buffer);
43
44 #endif  // RING_BUFFER_H_