libcute 0.1
Loading...
Searching...
No Matches
ring_buffer.h
Go to the documentation of this file.
1#pragma once
2
5#include "macro.h"
6#include "memory/allocator.h"
7#include "nostd.h"
8#include "object/destructor.h"
9#include "object/optional.h"
10#include "object/result.h"
11#include "utility.h"
12#include <stdbool.h>
13#include <stddef.h>
14
18typedef struct {
19 cu_Slice_Optional data;
20 size_t capacity;
21 size_t head;
22 size_t length;
25 cu_Destructor_Optional destructor;
27
29typedef enum {
30 CU_RINGBUFFER_ERROR_NONE = 0,
31 CU_RINGBUFFER_ERROR_OOM,
32 CU_RINGBUFFER_ERROR_INVALID_LAYOUT,
33 CU_RINGBUFFER_ERROR_INVALID,
34 CU_RINGBUFFER_ERROR_FULL,
35 CU_RINGBUFFER_ERROR_EMPTY,
37
40
41cu_RingBuffer_Result cu_RingBuffer_create(cu_Allocator allocator,
42 cu_Layout layout, size_t capacity, cu_Destructor_Optional destructor);
43
44void cu_RingBuffer_destroy(cu_RingBuffer *rb);
45
46static inline size_t cu_RingBuffer_size(const cu_RingBuffer *rb) {
47 CU_IF_NULL(rb) { return 0; }
48 return rb->length;
49}
50
51static inline size_t cu_RingBuffer_capacity(const cu_RingBuffer *rb) {
52 CU_IF_NULL(rb) { return 0; }
53 return rb->capacity;
54}
55
56static inline bool cu_RingBuffer_is_empty(const cu_RingBuffer *rb) {
57 CU_IF_NULL(rb) { return true; }
58 return rb->length == 0;
59}
60
61static inline bool cu_RingBuffer_is_full(const cu_RingBuffer *rb) {
62 CU_IF_NULL(rb) { return false; }
63 return rb->length == rb->capacity && rb->capacity > 0;
64}
65
66cu_RingBuffer_Error_Optional cu_RingBuffer_push(cu_RingBuffer *rb, void *elem);
67
68cu_RingBuffer_Error_Optional cu_RingBuffer_pop(
69 cu_RingBuffer *rb, void *out_elem);
70
#define CU_IF_NULL(expr)
Definition macro.h:6
#define CU_OPTIONAL_DECL(NAME, T)
Definition optional.h:25
#define CU_RESULT_DECL(NAME, T, E)
Definition result.h:23
void cu_RingBuffer_clear(cu_RingBuffer *rb)
Definition ring_buffer.c:102
cu_RingBuffer_Error
Definition ring_buffer.h:29
Definition allocator.h:24
Definition utility.h:22
Ring buffer storing elements in FIFO order.
Definition ring_buffer.h:18
cu_Layout layout
Definition ring_buffer.h:23
size_t capacity
Definition ring_buffer.h:20
cu_Allocator allocator
Definition ring_buffer.h:24
size_t head
Definition ring_buffer.h:21
cu_Slice_Optional data
Definition ring_buffer.h:19
size_t length
Definition ring_buffer.h:22
cu_Destructor_Optional destructor
Definition ring_buffer.h:25