arduino-audio-driver
Loading...
Searching...
No Matches
Vector.h
Go to the documentation of this file.
1#pragma once
2#include <assert.h>
3
4namespace audio_driver_local {
5
14template <class T>
15class Vector {
16 public:
23 class iterator {
24 protected:
25 T *ptr;
26 size_t pos_;
27 public:
28 inline iterator(){
29 }
30 inline iterator(T* parPtr, size_t pos){
31 this->ptr = parPtr;
32 this->pos_ = pos;
33 }
34 // copy constructor
35 inline iterator(const iterator &copyFrom){
36 ptr = copyFrom.ptr;
37 pos_ = copyFrom.pos_;
38 }
39 inline iterator operator++(int n) {
40 ptr++;
41 pos_++;
42 return *this;
43 }
45 ptr++;
46 pos_++;
47 return *this;
48 }
49 inline iterator operator--(int n) {
50 ptr--;
51 pos_--;
52 return *this;
53 }
55 ptr--;
56 pos_--;
57 return *this;
58 }
59 inline iterator operator+(int offset) {
60 pos_ += offset;
61 return iterator(ptr+offset, offset);
62 }
63 inline bool operator==(iterator it) {
64 return ptr == it.getPtr();
65 }
66 inline bool operator<(iterator it) {
67 return ptr < it.getPtr();
68 }
69 inline bool operator<=(iterator it) {
70 return ptr <= it.getPtr();
71 }
72 inline bool operator>(iterator it) {
73 return ptr > it.getPtr();
74 }
75 inline bool operator>=(iterator it) {
76 return ptr >= it.getPtr();
77 }
78 inline bool operator!=(iterator it) {
79 return ptr != it.getPtr();
80 }
81 inline T &operator*() {
82 return *ptr;
83 }
84 inline T *operator->() {
85 return ptr;
86 }
87 inline T *getPtr() {
88 return ptr;
89 }
90 inline size_t pos() {
91 return pos_;
92 }
93 inline size_t operator-(iterator it) {
94 return (ptr - it.getPtr());
95 }
96
97 };
98
99
101 inline Vector(size_t len = 20) {
102 resize_internal(len, false);
103 }
104
106 inline Vector(int size, T value) {
107 resize(size);
108 for (int j=0;j< size;j++){
109 p_data[j] = value;
110 }
111 }
112
113 inline Vector(Vector<T> &&moveFrom) {
114 // move constructor
115 this->p_data = moveFrom.p_data;
116 this->len = moveFrom.len;
117 this->bufferLen = moveFrom.bufferLen;
118 moveFrom.p_data = nullptr; // avoid double delete
119 moveFrom.len = 0;
120 moveFrom.bufferLen = 0;
121 };
122
123
125 inline Vector(Vector<T> &copyFrom) {
126 resize_internal(copyFrom.size(), false);
127 for (int j=0;j<copyFrom.size();j++){
128 p_data[j] = copyFrom[j];
129 }
130 this->len = copyFrom.size();
131 }
132
134 inline Vector(T *from, T *to) {
135 this->len = to - from;
136 resize_internal(this->len, false);
137 for (size_t j=0;j<this->len;j++){
138 p_data[j] = from[j];
139 }
140 }
141
143 virtual ~Vector() {
144 clear();
146 delete [] this->p_data;
147 }
148
149 inline void clear() {
150 len = 0;
151 }
152
153 inline int size() {
154 return len;
155 }
156
157 inline bool empty() {
158 return size()==0;
159 }
160
161 inline void push_back(T value){
162 resize_internal(len+1, true);
163 p_data[len] = value;
164 len++;
165 }
166
167 void push_front(T value){
168 resize_internal(len+1, true);
169 //memmove(p_data,p_data+1,len*sizeof(T));
170 for (int j=len; j >= 0; j--){
171 p_data[j+1] = p_data[j];
172 }
173 p_data[0] = value;
174 len++;
175 }
176
177 inline void pop_back(){
178 if (len>0) {
179 len--;
180 }
181 }
182
183 inline void pop_front(){
184 erase(0);
185 }
186
187
188 inline void assign(iterator v1, iterator v2) {
189 size_t newLen = v2 - v1;
190 resize_internal(newLen, false);
191 this->len = newLen;
192 int pos = 0;
193 for (auto ptr = v1; ptr != v2; ptr++) {
194 p_data[pos++] = *ptr;
195 }
196 }
197
198 inline void assign(size_t number, T value) {
199 resize_internal(number, false);
200 this->len = number;
201 for (int j=0;j<number;j++){
202 p_data[j]=value;
203 }
204 }
205
206 inline void swap(Vector<T> &in){
207 // save data
208 T *dataCpy = p_data;
209 int bufferLenCpy = bufferLen;
210 int lenCpy = len;
211 // swap this
212 p_data = in.p_data;
213 len = in.len;
214 bufferLen = in.bufferLen;
215 // swp in
216 in.p_data = dataCpy;
217 in.len = lenCpy;
218 in.bufferLen = bufferLenCpy;
219 }
220
221 inline T &operator[](int index) {
222 assert(p_data!=nullptr);
223 return p_data[index];
224 }
225
226 inline Vector<T> &operator=(Vector<T> &copyFrom) {
227 resize_internal(copyFrom.size(), false);
228 for (int j=0;j<copyFrom.size();j++){
229 p_data[j] = copyFrom[j];
230 }
231 this->len = copyFrom.size();
232 return *this;
233 }
234
235 inline T &operator[] (const int index) const {
236 return p_data[index];
237 }
238
239 inline bool resize(int newSize, T value){
240 if (resize(newSize)){
241 for (int j=0;j<newSize;j++){
242 p_data[j]=value;
243 }
244 return true;
245 }
246 return false;
247 }
248
249 inline void shrink_to_fit() {
250 resize_internal(this->len, true, true);
251 }
252
253 int capacity(){
254 return this->bufferLen;
255 }
256
257 inline bool resize(int newSize){
258 int oldSize = this->len;
259 resize_internal(newSize, true);
260 this->len = newSize;
261 return this->len!=oldSize;
262 }
263
264 inline iterator begin(){
265 return iterator(p_data, 0);
266 }
267
268 inline T& back(){
269 return *iterator(p_data+(len-1), len-1);
270 }
271
272 inline iterator end(){
273 return iterator(p_data+len, len);
274 }
275
276 // removes a single element
277 inline void erase(iterator it) {
278 return erase(it.pos());
279 }
280
281 // removes a single element
282 inline void erase(int pos) {
283 if (pos<len){
284 int lenToEnd = len - pos - 1;
285 // call destructor on data to be erased
286 p_data[pos].~T();
287 // shift values by 1 position
288 //memmove((void*) &p_data[pos],(void*)(&p_data[pos+1]),lenToEnd*sizeof(T));
289 for (int j=pos; j<len; j++){
290 p_data[j] = p_data[j+1];
291 }
292
293 // make sure that we have a valid object at the end
294 p_data[len-1] = T();
295 len--;
296 }
297 }
298
299 T* data(){
300 return p_data;
301 }
302
303 operator bool() const {
304 return p_data!=nullptr;
305 }
306
307 protected:
309 int len = 0;
310 T *p_data = nullptr;
311
312 inline void resize_internal(int newSize, bool copy, bool shrink=false) {
313 if (newSize<=0) return;
314 //bool withNewSize = false;
315 if (newSize>bufferLen || this->p_data==nullptr ||shrink){
316 //withNewSize = true;
317 T* oldData = p_data;
318 int oldBufferLen = this->bufferLen;
319 this->p_data = new T[newSize+1];
320 this->bufferLen = newSize;
321 if (oldData != nullptr) {
322 if(copy && this->len > 0){
323 memcpy((void*)p_data,(void*) oldData, this->len*sizeof(T));
324 }
325 if (shrink){
326 cleanup(oldData, newSize, oldBufferLen);
327 }
328 delete [] oldData;
329 }
330 }
331 assert(p_data!=nullptr);
332 }
333
334 void cleanup(T*data, int from, int to){
335 for (int j=from;j<to;j++){
336 data[j].~T();
337 }
338 }
339};
340
341} // namespace audio_driver_local
Iterator for the Vector class.
Definition Vector.h:23
bool operator>=(iterator it)
Definition Vector.h:75
size_t pos()
Definition Vector.h:90
iterator operator+(int offset)
Definition Vector.h:59
bool operator<(iterator it)
Definition Vector.h:66
iterator operator--(int n)
Definition Vector.h:49
bool operator<=(iterator it)
Definition Vector.h:69
T & operator*()
Definition Vector.h:81
T * operator->()
Definition Vector.h:84
iterator(T *parPtr, size_t pos)
Definition Vector.h:30
T * ptr
Definition Vector.h:25
iterator operator++(int n)
Definition Vector.h:39
iterator()
Definition Vector.h:28
iterator operator++()
Definition Vector.h:44
iterator operator--()
Definition Vector.h:54
iterator(const iterator &copyFrom)
Definition Vector.h:35
size_t pos_
Definition Vector.h:26
T * getPtr()
Definition Vector.h:87
bool operator==(iterator it)
Definition Vector.h:63
size_t operator-(iterator it)
Definition Vector.h:93
bool operator!=(iterator it)
Definition Vector.h:78
bool operator>(iterator it)
Definition Vector.h:72
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:15
void pop_back()
Definition Vector.h:177
Vector(T *from, T *to)
legacy constructor with pointer range
Definition Vector.h:134
void swap(Vector< T > &in)
Definition Vector.h:206
bool resize(int newSize)
Definition Vector.h:257
void erase(iterator it)
Definition Vector.h:277
Vector(Vector< T > &&moveFrom)
Definition Vector.h:113
void push_front(T value)
Definition Vector.h:167
Vector< T > & operator=(Vector< T > &copyFrom)
Definition Vector.h:226
virtual ~Vector()
Destructor.
Definition Vector.h:143
void assign(size_t number, T value)
Definition Vector.h:198
Vector(int size, T value)
allocate size and initialize array
Definition Vector.h:106
bool empty()
Definition Vector.h:157
Vector(size_t len=20)
default constructor
Definition Vector.h:101
T & back()
Definition Vector.h:268
int bufferLen
Definition Vector.h:308
Vector(Vector< T > &copyFrom)
copy constructor
Definition Vector.h:125
void pop_front()
Definition Vector.h:183
void shrink_to_fit()
Definition Vector.h:249
void push_back(T value)
Definition Vector.h:161
void resize_internal(int newSize, bool copy, bool shrink=false)
Definition Vector.h:312
void erase(int pos)
Definition Vector.h:282
void cleanup(T *data, int from, int to)
Definition Vector.h:334
T * p_data
Definition Vector.h:310
T & operator[](int index)
Definition Vector.h:221
void assign(iterator v1, iterator v2)
Definition Vector.h:188
bool resize(int newSize, T value)
Definition Vector.h:239
void clear()
Definition Vector.h:149
iterator end()
Definition Vector.h:272
iterator begin()
Definition Vector.h:264
int capacity()
Definition Vector.h:253
T * data()
Definition Vector.h:299
int size()
Definition Vector.h:153
int len
Definition Vector.h:309
Definition Optional.h:3