MCPcopy Create free account
hub / github.com/Ralim/usb-pd / ringbuffer

Class ringbuffer

include/ringbuffer.h:8–61  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6 * create a trivial ringbuffer with space for up to size elements.
7 */
8template <typename T, size_t size> class ringbuffer {
9public:
10 explicit ringbuffer() : begin(0), end(0), wrap(false) {}
11
12 void push(const T *data) {
13
14 memcpy(buffer + end, data, sizeof(T));
15 // If going to wrap, push start along to maintain order
16 if (begin == end && wrap) {
17 begin = (begin + 1) % size;
18 }
19 end = (end + 1) % size;
20 if (begin == end) {
21 wrap = true;
22 }
23 }
24 // Give null to just drop the data
25 void pop(T *dest) {
26 if (getOccupied() == 0) {
27 return;
28 }
29
30 if (dest) {
31 memcpy(dest, buffer + begin, sizeof(T));
32 }
33 begin = (begin + 1) % size;
34 if (wrap && (begin == 0)) {
35 wrap = false;
36 }
37 }
38 // Returns number of objects queued in the buffer
39 size_t getOccupied() const {
40 if (end == begin) {
41 return wrap ? size : 0;
42 } else if (end > begin) {
43 return end - begin;
44 } else {
45 return size + end - begin;
46 }
47 }
48
49 size_t getFree() const { return size - getOccupied(); }
50 // Clear the entire buffer
51 void flush() {
52 wrap = false;
53 begin = end = 0;
54 }
55
56private:
57 T buffer[size];
58 size_t begin;
59 size_t end;
60 bool wrap;
61};
62
63#endif // RINGBUFFER_H

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected