AdsLib
Loading...
Searching...
No Matches
RingBuffer.h
1// SPDX-License-Identifier: MIT
6#pragma once
7
8#include <cassert>
9#include <cstdint>
10#include <memory>
11
12struct RingBuffer {
13 RingBuffer(size_t N)
14 : dataSize(N + 1),
15 data(new uint8_t[N + 1]),
16 write(data.get()),
17 read(data.get())
18 {}
19
20 size_t BytesFree() const
21 {
22 return (write < read) ? read - write - 1 : dataSize - 1 - (write - read);
23 }
24
25 size_t BytesAvailable() const
26 {
27 return dataSize - BytesFree() - 1;
28 }
29
30 size_t WriteChunk() const
31 {
32 return (write < read) ? read - write - 1 : data.get() + dataSize - write - (data.get() == read);
33 }
34
35 void Write(size_t n)
36 {
37 assert(n <= BytesFree());
38 write = Increment(write, n);
39 }
40
41 template<class T> T ReadFromLittleEndian()
42 {
43 T result = 0;
44 for (size_t i = 0; i < sizeof(T); ++i) {
45 result += (((T)(*read)) << (8 * i));
46 read = Increment(read, 1);
47 }
48 return result;
49 }
50
51 void Read(size_t n)
52 {
53 assert(n <= BytesAvailable());
54 read = Increment(read, n);
55 }
56
57private:
58 const size_t dataSize;
59 const std::unique_ptr<uint8_t[]> data;
60
61 inline uint8_t* Increment(const uint8_t* ptr, size_t n)
62 {
63 return data.get() + ((ptr - data.get() + n) % dataSize);
64 }
65public:
66 uint8_t* write;
67 const uint8_t* read;
68};
Definition: RingBuffer.h:12