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 
23 #include "tsrb.h"
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
34 static inline void turb_clear(tsrb_t *rb)
35 {
36  rb->reads = rb->writes;
37 }
38 
46 static inline int turb_empty(const tsrb_t *rb)
47 {
48  int retval = (rb->reads == rb->writes);
49  return retval;
50 }
51 
58 static inline unsigned int turb_avail(const tsrb_t *rb)
59 {
60  unsigned retval = (rb->writes - rb->reads);
61  return retval;
62 }
63 
71 static inline int turb_full(const tsrb_t *rb)
72 {
73  int retval = (rb->writes - rb->reads) == rb->size;
74  return retval;
75 }
76 
83 static 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 */
91 static inline void _turb_push(tsrb_t *rb, uint8_t c)
92 {
93  rb->buf[rb->writes++ & (rb->size - 1)] = c;
94 }
95 
96 static inline uint8_t _turb_pop(tsrb_t *rb)
97 {
98  return rb->buf[rb->reads++ & (rb->size - 1)];
99 }
100 
101 static 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 
114 static 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 
130 static 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 
147 static 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 
165 static 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 
182 static 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 
200 static 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 
218 static 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 
thread-safe ringbuffer struct
Definition: tsrb.h:38
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