Open FFBoard
Open source force feedback firmware
ringbufferwrapper.h
Go to the documentation of this file.
1#ifndef __RING_BUFFER_WRAPPER_H__
2#define __RING_BUFFER_WRAPPER_H__
3
4#include <stdint.h>
5#include <type_traits>
6
7#include <ringbuffer.h>
8
10
11public:
12
13 /*
14 * Warning: Size must be multiple of 2.
15 */
16 explicit RingBufferWrapper(uint8_t* data, uint32_t len) noexcept;
17 explicit RingBufferWrapper(uint32_t size) noexcept;
18 virtual ~RingBufferWrapper() noexcept;
19
20 bool isValid() noexcept;
21
22 bool empty() noexcept;
23 size_t length() noexcept;
24 size_t freeSpace() noexcept;
25 size_t capacity() noexcept;
26
27 size_t appendOne(uint8_t data) noexcept;
28 size_t appendMultiple(const uint8_t *data, size_t len) noexcept;
29
30 size_t peekOne(uint8_t* data) noexcept;
31 size_t getOne(uint8_t* data) noexcept;
32
33 size_t getMultiple(uint8_t *dst, size_t len) noexcept;
34 size_t peekMultiple(uint8_t *dst, size_t len) noexcept;
35
36 size_t discardMultiple(size_t len) noexcept;
37 void clean() noexcept;
38
39 template<typename T>
40 T get_as(bool* ok) noexcept;
41
42 template<typename T>
43 T peek_as(bool* ok) noexcept;
44
45 template<typename T>
46 size_t numElements() noexcept;
47
48private:
49
51 bool valid;
52};
53
54template<typename T>
55T RingBufferWrapper::peek_as(bool* ok) noexcept
56{
57 T data;
58 // Only POD types can be trivially copied from
59 // the ring buffer.
60 if (!std::is_pod<T>::value) {
61 *ok = false;
62 return data;
63 }
64
65 if (length() < sizeof(T))
66 {
67 *ok = false;
68 return data;
69 }
70
71 size_t len = peekMultiple(static_cast<uint8_t*>(&data), sizeof(T));
72 /*
73 * This should be always true because we verified the
74 * buffer length before reading.
75 */
76 *ok = len == sizeof(T);
77 return data;
78}
79
80template<typename T>
81T RingBufferWrapper::get_as(bool* ok) noexcept
82{
83 T data = peek_as<T>(ok);
84 if (*ok) {
85 discardMultiple(sizeof(T));
86 }
87 return data;
88}
89
90template<typename T>
92{
93 return length() / sizeof(T);
94}
95
96
97#endif
virtual ~RingBufferWrapper() noexcept
size_t appendOne(uint8_t data) noexcept
size_t length() noexcept
size_t freeSpace() noexcept
T peek_as(bool *ok) noexcept
void clean() noexcept
size_t peekOne(uint8_t *data) noexcept
T get_as(bool *ok) noexcept
bool empty() noexcept
size_t discardMultiple(size_t len) noexcept
size_t capacity() noexcept
size_t peekMultiple(uint8_t *dst, size_t len) noexcept
RingBufferWrapper(uint8_t *data, uint32_t len) noexcept
size_t numElements() noexcept
size_t getMultiple(uint8_t *dst, size_t len) noexcept
bool isValid() noexcept
size_t getOne(uint8_t *data) noexcept
size_t appendMultiple(const uint8_t *data, size_t len) noexcept
static struct @612 data