Loading...
Searching...
No Matches
turb.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Kaspar Schleiser <kaspar@schleiser.de>
3 * SPDX-FileCopyrightText: 2025 Karl Fessel <karl.fessel@ml-pa.com> ML!PA Consulting GmbH
4 * SPDX-License-Identifier: LGPL-2.1-only
5 */
6
7#pragma once
8
22
23#include "tsrb.h"
24
25#ifdef __cplusplus
26extern "C" {
27#endif
28
34static inline void turb_clear(tsrb_t *rb)
35{
36 rb->reads = rb->writes;
37}
38
46static inline int turb_empty(const tsrb_t *rb)
47{
48 int retval = (rb->reads == rb->writes);
49 return retval;
50}
51
58static inline unsigned int turb_avail(const tsrb_t *rb)
59{
60 unsigned retval = (rb->writes - rb->reads);
61 return retval;
62}
63
71static inline int turb_full(const tsrb_t *rb)
72{
73 int retval = (rb->writes - rb->reads) == rb->size;
74 return retval;
75}
76
83static inline unsigned int turb_free(const tsrb_t *rb)
84{
85 unsigned int retval = (rb->size - rb->writes + rb->reads);
86 return retval;
87}
88
89#ifndef DOXYGEN
90/* these are internal function */
91static inline void _turb_push(tsrb_t *rb, uint8_t c)
92{
93 rb->buf[rb->writes++ & (rb->size - 1)] = c;
94}
95
96static inline uint8_t _turb_pop(tsrb_t *rb)
97{
98 return rb->buf[rb->reads++ & (rb->size - 1)];
99}
100
101static inline uint8_t _turb_peek(tsrb_t *rb, unsigned int idx)
102{
103 return rb->buf[(rb->reads + idx) & (rb->size - 1)];
104}
105#endif
106
114static inline int turb_get_one(tsrb_t *rb)
115{
116 int retval = -1;
117 if (!turb_empty(rb)) {
118 retval = _turb_pop(rb);
119 }
120 return retval;
121}
122
130static inline int turb_peek_one(tsrb_t *rb)
131{
132 int retval = -1;
133 if (!turb_empty(rb)) {
134 retval = _turb_peek(rb, 0);
135 }
136 return retval;
137}
138
147static inline int turb_get(tsrb_t *rb, uint8_t *dst, size_t n)
148{
149 size_t cnt = 0;
150 while (n-- && !turb_empty(rb)) {
151 *dst++ = _turb_pop(rb);
152 cnt++;
153 }
154 return (int) cnt;
155}
156
165static inline int turb_peek(tsrb_t *rb, uint8_t *dst, size_t n)
166{
167 size_t idx = 0;
168 unsigned int avail = turb_avail(rb);
169 while (idx < n && idx != avail) {
170 *dst++ = _turb_peek(rb, idx++);
171 }
172 return (int) idx;
173}
174
182static inline int turb_drop(tsrb_t *rb, size_t n)
183{
184 size_t cnt = 0;
185 while (n-- && !turb_empty(rb)) {
186 _turb_pop(rb);
187 cnt++;
188 }
189 return (int) cnt;
190}
191
200static inline int turb_add_one(tsrb_t *rb, uint8_t c)
201{
202 int retval = -1;
203 if (!turb_full(rb)) {
204 _turb_push(rb, c);
205 retval = 0;
206 }
207 return retval;
208}
209
218static inline int turb_add(tsrb_t *rb, const uint8_t *src, size_t n)
219{
220 size_t ret = 0;
221 while (n-- && !turb_full(rb)) {
222 _turb_push(rb, *src++);
223 ret++;
224 }
225 return (int) ret;
226}
227
228#ifdef __cplusplus
229}
230#endif
231
struct tsrb tsrb_t
thread-safe ringbuffer struct
unsigned writes
total number of writes
Definition tsrb.h:42
unsigned reads
total number of reads
Definition tsrb.h:41
uint8_t * buf
Buffer to operate on.
Definition tsrb.h:39
unsigned int size
Size of buffer, must be power of 2.
Definition tsrb.h:40
Thread-safe ringbuffer interface definition.
static unsigned int turb_free(const tsrb_t *rb)
Get free space in ringbuffer.
Definition turb.h:83
static int turb_peek(tsrb_t *rb, uint8_t *dst, size_t n)
Get bytes from ringbuffer, without removing them.
Definition turb.h:165
static int turb_add_one(tsrb_t *rb, uint8_t c)
Add a byte to ringbuffer.
Definition turb.h:200
static int turb_empty(const tsrb_t *rb)
Test if the tsrb is empty.
Definition turb.h:46
static int turb_drop(tsrb_t *rb, size_t n)
Drop bytes from ringbuffer.
Definition turb.h:182
static unsigned int turb_avail(const tsrb_t *rb)
Get number of bytes available for reading.
Definition turb.h:58
static int turb_get_one(tsrb_t *rb)
Get a byte from ringbuffer.
Definition turb.h:114
static int turb_full(const tsrb_t *rb)
Test if the tsrb is full.
Definition turb.h:71
static void turb_clear(tsrb_t *rb)
Clear a tsrb.
Definition turb.h:34
static int turb_add(tsrb_t *rb, const uint8_t *src, size_t n)
Add bytes to ringbuffer.
Definition turb.h:218
static int turb_get(tsrb_t *rb, uint8_t *dst, size_t n)
Get bytes from ringbuffer.
Definition turb.h:147
static int turb_peek_one(tsrb_t *rb)
Get a byte from ringbuffer, without removing it.
Definition turb.h:130