41 static inline void circlebuf_init(
struct circlebuf *cb)
46 static inline void circlebuf_free(
struct circlebuf *cb)
52 static inline void circlebuf_reorder_data(
struct circlebuf *cb,
61 difference = new_capacity - cb->
capacity;
67 static inline void circlebuf_ensure_capacity(
struct circlebuf *cb)
74 if (cb->
size > new_capacity)
75 new_capacity = cb->
size;
78 circlebuf_reorder_data(cb, new_capacity);
84 if (capacity <= cb->capacity)
88 circlebuf_reorder_data(cb, capacity);
92 static inline void circlebuf_upsize(
struct circlebuf *cb,
size_t size)
94 size_t add_size = size - cb->
size;
95 size_t new_end_pos = cb->
end_pos + add_size;
101 circlebuf_ensure_capacity(cb);
105 size_t loop_size = add_size - back_size;
110 memset(cb->
data, 0, loop_size);
120 static inline void circlebuf_place(
struct circlebuf *cb,
size_t position,
121 const void *
data,
size_t size)
123 size_t end_point = position +
size;
126 if (end_point > cb->
size)
127 circlebuf_upsize(cb, end_point);
133 data_end_pos = position +
size;
135 size_t back_size = data_end_pos - cb->
capacity;
136 size_t loop_size = size - back_size;
139 memcpy((
uint8_t*)cb->
data + position, data, loop_size);
140 memcpy(cb->
data, (
uint8_t*)data + loop_size, back_size);
146 static inline void circlebuf_push_back(
struct circlebuf *cb,
const void *data,
152 circlebuf_ensure_capacity(cb);
156 size_t loop_size = size - back_size;
161 memcpy(cb->
data, (
uint8_t*)data + back_size, loop_size);
171 static inline void circlebuf_push_front(
struct circlebuf *cb,
const void *data,
175 circlebuf_ensure_capacity(cb);
192 static inline void circlebuf_peek_front(
struct circlebuf *cb,
void *data,
195 assert(size <= cb->size);
200 if (start_size < size) {
211 static inline void circlebuf_peek_back(
struct circlebuf *cb,
void *data,
214 assert(size <= cb->size);
219 if (back_size < size) {
220 size_t front_size = size - back_size;
221 size_t new_end_pos = cb->
capacity - front_size;
223 memcpy((
uint8_t*)data + (size - back_size), cb->
data,
234 static inline void circlebuf_pop_front(
struct circlebuf *cb,
void *data,
237 circlebuf_peek_front(cb, data, size);
245 static inline void circlebuf_pop_back(
struct circlebuf *cb,
void *data,
248 circlebuf_peek_front(cb, data, size);
Definition: circlebuf.h:32
EXPORT void * brealloc(void *ptr, size_t size)
size_t end_pos
Definition: circlebuf.h:37
unsigned char uint8_t
Definition: vc_stdint.h:27
size_t size
Definition: circlebuf.h:34
size_t capacity
Definition: circlebuf.h:38
size_t start_pos
Definition: circlebuf.h:36
void * data
Definition: circlebuf.h:33
EXPORT void bfree(void *ptr)