XenevaOS
Loading...
Searching...
No Matches
Buffers.h
Go to the documentation of this file.
1
2#pragma once
3
4#include <limits.h> /* For INT_MAX */
5#include "utils/helix_log.h"
6#include "utils/Vector.h"
7
8#ifndef MIN
9# define MIN(a,b) (((a)<(b))?(a):(b))
10#endif
11
12#ifndef MAX
13# define MAX(a,b) (((a)>(b))?(a):(b))
14#endif
15
16
23namespace libhelix {
24
31template <typename T>
33 public:
34 BaseBuffer() = default;
35 virtual ~BaseBuffer() = default;
36 BaseBuffer(BaseBuffer const &) = delete;
37 BaseBuffer &operator=(BaseBuffer const &) = delete;
38
40 virtual T read() = 0;
41
43 virtual int readArray(T data[], int len) {
44 if (data==nullptr){
45 LOGE_HELIX("NPE");
46 return 0;
47 }
48 int lenResult = MIN(len, available());
49 for (int j = 0; j < lenResult; j++) {
50 data[j] = read();
51 }
52 LOGD_HELIX("readArray %d -> %d", len, lenResult);
53 return lenResult;
54 }
55
57 virtual int clearArray(int len) {
58 int lenResult = MIN(len, available());
59 for (int j = 0; j < lenResult; j++) {
60 read();
61 }
62 return lenResult;
63 }
64
65
67 virtual int writeArray(const T data[], int len) {
68 // LOGD_HELIX("%s: %d", LOG_METHOD, len);
69 // CHECK_MEMORY();
70
71 int result = 0;
72 for (int j = 0; j < len; j++) {
73 if (!write(data[j])) {
74 break;
75 }
76 result = j + 1;
77 }
78 // CHECK_MEMORY();
79 LOGD_HELIX("writeArray %d -> %d", len, result);
80 return result;
81 }
82
83
85 virtual int writeArrayOverwrite(const T data[], int len) {
86 int to_delete = len - availableForWrite();
87 if (to_delete>0){
88 clearArray(to_delete);
89 }
90 return writeArray(data, len);
91 }
92
93
95 int readFrames(T data[][2], int len) {
96 LOGD_HELIX("%s: %d", LOG_METHOD, len);
97 // CHECK_MEMORY();
98 int result = MIN(len, available());
99 for (int j = 0; j < result; j++) {
100 T sample = read();
101 data[j][0] = sample;
102 data[j][1] = sample;
103 }
104 // CHECK_MEMORY();
105 return result;
106 }
107
108 template <int rows, int channels>
109 int readFrames(T (&data)[rows][channels]) {
110 int lenResult = MIN(rows, available());
111 for (int j = 0; j < lenResult; j++) {
112 T sample = read();
113 for (int i = 0; i < channels; i++) {
114 // data[j][i] = htons(sample);
115 data[j][i] = sample;
116 }
117 }
118 return lenResult;
119 }
120
122 virtual T peek() = 0;
123
125 virtual bool isFull() = 0;
126
127 bool isEmpty() { return available() == 0; }
128
130 virtual bool write(T data) = 0;
131
133 virtual void reset() = 0;
134
136 void clear() { reset(); }
137
139 virtual int available() = 0;
140
142 virtual int availableForWrite() = 0;
143
145 virtual T *address() = 0;
146
147 virtual size_t size() = 0;
148
149 protected:
150 void setWritePos(int pos){};
151};
152
161template <typename T>
162class SingleBuffer : public BaseBuffer<T> {
163 public:
170 this->max_size = size;
171 buffer.resize(max_size);
172 reset();
173 }
174
179
182 this->owns_buffer = false;
183 this->buffer = (uint8_t *)data;
184 this->current_read_pos = 0;
185 this->current_write_pos = len;
186 }
187
188 bool write(T sample) override {
189 bool result = false;
192 result = true;
193 }
194 return result;
195 }
196
197 T read() override {
198 T result = 0;
200 result = buffer[current_read_pos++];
201 }
202 return result;
203 }
204
205 T peek() override {
206 T result = 0;
208 result = buffer[current_read_pos];
209 }
210 return result;
211 }
212
213 int available() override {
214 int result = current_write_pos - current_read_pos;
215 return MAX(result, 0);
216 }
217
218 int availableForWrite() override { return max_size - current_write_pos; }
219
220 bool isFull() override { return availableForWrite() <= 0; }
221
223 int clearArray(int len) override{
224 if (len<=0) return 0;
225 int len_available = available();
226 if (len>available()) {
227 reset();
228 return len_available;
229 }
231 len_available -= len;
232 memmove(buffer.data(), buffer.data()+current_read_pos, len_available);
234 current_write_pos = len_available;
235
238 }
239
240 return len;
241 }
242
244 T *address() override { return buffer.data(); }
245
247 T *data() { return buffer.data()+current_read_pos; }
248
249 void reset() override {
253 memset(buffer.data(),0,buffer.size());
254 }
255 }
256
259 size_t setAvailable(size_t available_size) {
260 size_t result = MIN(available_size, (size_t) max_size);
262 current_write_pos = result;
263 return result;
264 }
265
266
267 size_t size() override { return max_size; }
268
269 void resize(int size) {
270 if (buffer.size() != size) {
271 buffer.resize(size);
272 max_size = size;
273 }
274 }
275
280
281 protected:
282 int max_size = 0;
285 bool owns_buffer = true;
286 bool is_clear_with_zero = false;
288
289 void setWritePos(int pos) { current_write_pos = pos; }
290};
291
292
293} // ns
#define LOGE_HELIX(...)
Definition Allocator.h:16
#define LOG_METHOD
Definition ConfigHelix.h:47
void * memmove(void *Dest, const void *Src, ACPI_SIZE Count)
Definition utclib.c:255
unsigned char uint8_t
Definition acefiex.h:161
#define write
Definition acwin.h:181
flag
Definition bytecode.h:29
Shared functionality of all buffers.
Definition Buffers.h:32
int readFrames(T data[][2], int len)
reads multiple values for array of 2 dimensional frames
Definition Buffers.h:95
virtual void reset()=0
clears the buffer
virtual int readArray(T data[], int len)
reads multiple values
Definition Buffers.h:43
virtual ~BaseBuffer()=default
virtual int available()=0
provides the number of entries that are available to read
void clear()
same as reset
Definition Buffers.h:136
virtual T * address()=0
returns the address of the start of the physical read buffer
void setWritePos(int pos)
Definition Buffers.h:150
virtual size_t size()=0
virtual T peek()=0
peeks the actual entry from the buffer
virtual int availableForWrite()=0
provides the number of entries that are available to write
virtual bool isFull()=0
checks if the buffer is full
virtual int clearArray(int len)
Removes the next len entries.
Definition Buffers.h:57
int readFrames(T(&data)[rows][channels])
Definition Buffers.h:109
bool isEmpty()
Definition Buffers.h:127
BaseBuffer & operator=(BaseBuffer const &)=delete
virtual int writeArray(const T data[], int len)
Fills the buffer data.
Definition Buffers.h:67
virtual int writeArrayOverwrite(const T data[], int len)
Fills the buffer data and overwrites the oldest data if the buffer is full.
Definition Buffers.h:85
BaseBuffer(BaseBuffer const &)=delete
virtual bool write(T data)=0
write add an entry to the buffer
virtual T read()=0
reads a single value
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:162
void onExternalBufferRefilled(void *data, int len)
notifies that the external buffer has been refilled
Definition Buffers.h:181
int current_write_pos
Definition Buffers.h:284
SingleBuffer(int size)
Construct a new Single Buffer object.
Definition Buffers.h:169
int available() override
provides the number of entries that are available to read
Definition Buffers.h:213
T peek() override
peeks the actual entry from the buffer
Definition Buffers.h:205
int max_size
Definition Buffers.h:282
T * address() override
Provides address to beginning of the buffer.
Definition Buffers.h:244
void setClearWithZero(bool flag)
Sets the buffer to 0 on clear.
Definition Buffers.h:277
bool is_clear_with_zero
Definition Buffers.h:286
void setWritePos(int pos)
Definition Buffers.h:289
SingleBuffer()
Construct a new Single Buffer w/o allocating any memory.
Definition Buffers.h:178
bool isFull() override
checks if the buffer is full
Definition Buffers.h:220
T * data()
Provides address of actual data.
Definition Buffers.h:247
int availableForWrite() override
provides the number of entries that are available to write
Definition Buffers.h:218
void reset() override
clears the buffer
Definition Buffers.h:249
bool owns_buffer
Definition Buffers.h:285
Vector< T > buffer
Definition Buffers.h:287
T read() override
reads a single value
Definition Buffers.h:197
void resize(int size)
Definition Buffers.h:269
int current_read_pos
Definition Buffers.h:283
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:188
size_t setAvailable(size_t available_size)
Definition Buffers.h:259
size_t size() override
Definition Buffers.h:267
int clearArray(int len) override
consumes len bytes and moves current data to the beginning
Definition Buffers.h:223
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:18
int sample
Definition h264bsd_deblocking.c:642
#define LOGD_HELIX(...)
Definition helix_log_idf.h:21
size_t len
Definition initial.c:23
void memset(void)
void * data
Definition kthread.h:30
#define MIN(a, b)
Definition kernel.h:576
#define MAX(a, b)
Definition kernel.h:577
Definition Allocator.h:19
__virtio16 rows
Definition virtio_console.h:3