summaryrefslogtreecommitdiffstats
path: root/mqtt_websockets/c-rbuf/src/ringbuffer_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'mqtt_websockets/c-rbuf/src/ringbuffer_internal.h')
-rw-r--r--mqtt_websockets/c-rbuf/src/ringbuffer_internal.h43
1 files changed, 43 insertions, 0 deletions
diff --git a/mqtt_websockets/c-rbuf/src/ringbuffer_internal.h b/mqtt_websockets/c-rbuf/src/ringbuffer_internal.h
new file mode 100644
index 000000000..f7bdf815c
--- /dev/null
+++ b/mqtt_websockets/c-rbuf/src/ringbuffer_internal.h
@@ -0,0 +1,43 @@
+/*
+ *
+ * Copyright: SPDX-License-Identifier: LGPL-3.0-only
+ *
+ * Author: Timotej Šiškovič <timotejs@gmail.com>
+ *
+ */
+
+#ifndef RINGBUFFER_INTERNAL_H
+#define RINGBUFFER_INTERNAL_H
+
+struct rbuf_t {
+ char *data;
+
+ // points to next byte where we can write
+ char *head;
+ // points to oldest (next to be poped) readable byte
+ char *tail;
+
+ // to avoid calculating data + size
+ // all the time
+ char *end;
+
+ size_t size;
+ size_t size_data;
+};
+
+/* this exists so that it can be tested by unit tests
+ * without optimization that resets head and tail to
+ * beginning if buffer empty
+ */
+inline static int rbuf_bump_tail_noopt(rbuf_t buffer, size_t bytes)
+{
+ if (bytes > buffer->size_data)
+ return 0;
+ int i = buffer->tail - buffer->data;
+ buffer->tail = &buffer->data[(i + bytes) % buffer->size];
+ buffer->size_data -= bytes;
+
+ return 1;
+}
+
+#endif