Arduino DLNA Server
Loading...
Searching...
No Matches
Vector.h
Go to the documentation of this file.
1#pragma once
2#ifdef USE_INITIALIZER_LIST
3#include "InitializerList.h"
4#endif
5#include <assert.h>
6
7#include "Allocator.h"
8
9namespace tiny_dlna {
10
20template <class T>
21class Vector {
22 public:
23
33 class Iterator {
34 protected:
35 T *ptr;
36 size_t pos_;
37
38 public:
40 Iterator(T *parPtr, size_t pos) {
41 this->ptr = parPtr;
42 this->pos_ = pos;
43 }
44 // copy constructor
45 Iterator(const Iterator &copyFrom) {
46 ptr = copyFrom.ptr;
47 pos_ = copyFrom.pos_;
48 }
50 ptr++;
51 pos_++;
52 return *this;
53 }
55 ptr++;
56 pos_++;
57 return *this;
58 }
60 ptr--;
61 pos_--;
62 return *this;
63 }
65 ptr--;
66 pos_--;
67 return *this;
68 }
69 Iterator operator+(int offset) {
70 pos_ += offset;
71 return Iterator(ptr + offset, offset);
72 }
73 bool operator==(Iterator it) { return ptr == it.getPtr(); }
74 bool operator<(Iterator it) { return ptr < it.getPtr(); }
75 bool operator<=(Iterator it) { return ptr <= it.getPtr(); }
76 bool operator>(Iterator it) { return ptr > it.getPtr(); }
77 bool operator>=(Iterator it) { return ptr >= it.getPtr(); }
78 bool operator!=(Iterator it) { return ptr != it.getPtr(); }
79 T &operator*() { return *ptr; }
80 T *operator->() { return ptr; }
81 T *getPtr() { return ptr; }
82 size_t pos() { return pos_; }
83 size_t operator-(Iterator it) { return (ptr - it.getPtr()); }
84 };
85
86#ifdef USE_INITIALIZER_LIST
87
89 Vector(std::initializer_list<T> iniList) {
90 resize(iniList.size());
91 int pos = 0;
92 for (auto &obj : iniList) {
93 p_data[pos++] = obj;
94 }
95 }
96
97#endif
98
100 Vector(size_t len = 0, Allocator &allocator = DefaultAllocator) {
101 setAllocator(allocator);
102 resize_internal(len, false);
103 }
104
106 Vector(Allocator &allocator) { setAllocator(allocator); }
107
109 Vector(int size, T value, Allocator &allocator = DefaultAllocator) {
110 setAllocator(allocator);
111 resize(size);
112 for (int j = 0; j < size; j++) {
113 p_data[j] = value;
114 }
115 }
116
118 Vector(Vector<T> &&moveFrom) {
119 swap(moveFrom);
120 moveFrom.clear();
121 };
122
124 Vector &operator=(Vector &&moveFrom) {
125 swap(moveFrom);
126 moveFrom.clear();
127 return *this;
128 }
129
131 Vector(Vector<T> &copyFrom) {
132 this->p_allocator = copyFrom.p_allocator;
133 resize_internal(copyFrom.size(), false);
134 for (int j = 0; j < copyFrom.size(); j++) {
135 p_data[j] = copyFrom[j];
136 }
137 this->len = copyFrom.size();
138 }
139
142 resize_internal(copyFrom.size(), false);
143 for (int j = 0; j < copyFrom.size(); j++) {
144 p_data[j] = copyFrom[j];
145 }
146 this->len = copyFrom.size();
147 return *this;
148 }
149
151 Vector(T *from, T *to, Allocator &allocator = DefaultAllocator) {
152 this->p_allocator = &allocator;
153 this->len = to - from;
154 resize_internal(this->len, false);
155 for (size_t j = 0; j < this->len; j++) {
156 p_data[j] = from[j];
157 }
158 }
159
161 virtual ~Vector() { reset(); }
162
163 void setAllocator(Allocator &allocator) { p_allocator = &allocator; }
164
165 void clear() { len = 0; }
166
167 int size() { return len; }
168
169 bool empty() { return size() == 0; }
170
171 void push_back(T &&value) {
172 resize_internal(len + 1, true);
173 p_data[len] = value;
174 len++;
175 }
176
177 void push_back(T &value) {
178 resize_internal(len + 1, true);
179 p_data[len] = value;
180 len++;
181 }
182
183 void push_front(T &value) {
184 resize_internal(len + 1, true);
185 // memmove(p_data,p_data+1,len*sizeof(T));
186 for (int j = len; j >= 0; j--) {
187 p_data[j + 1] = p_data[j];
188 }
189 p_data[0] = value;
190 len++;
191 }
192
193 void push_front(T &&value) {
194 resize_internal(len + 1, true);
195 // memmove(p_data,p_data+1,len*sizeof(T));
196 for (int j = len; j >= 0; j--) {
197 p_data[j + 1] = p_data[j];
198 }
199 p_data[0] = value;
200 len++;
201 }
202
203 void pop_back() {
204 if (len > 0) {
205 len--;
206 }
207 }
208
209 void pop_front() { erase(0); }
210
211 void assign(Iterator v1, Iterator v2) {
212 size_t newLen = v2 - v1;
213 resize_internal(newLen, false);
214 this->len = newLen;
215 int pos = 0;
216 for (auto ptr = v1; ptr != v2; ptr++) {
217 p_data[pos++] = *ptr;
218 }
219 }
220
221 void assign(size_t number, T value) {
222 resize_internal(number, false);
223 this->len = number;
224 for (int j = 0; j < number; j++) {
225 p_data[j] = value;
226 }
227 }
228
229 void swap(Vector<T> &in) {
230 // save data
231 T *dataCpy = p_data;
232 int bufferLenCpy = max_capacity;
233 int lenCpy = len;
234 // swap this
235 p_data = in.p_data;
236 len = in.len;
238 // swp in
239 in.p_data = dataCpy;
240 in.len = lenCpy;
241 in.max_capacity = bufferLenCpy;
242 }
243
244 T &operator[](int index) {
245 assert(p_data != nullptr);
246 return p_data[index];
247 }
248
249 T &operator[](const int index) const { return p_data[index]; }
250
251 bool resize(int newSize, T value) {
252 if (resize(newSize)) {
253 for (int j = 0; j < newSize; j++) {
254 p_data[j] = value;
255 }
256 return true;
257 }
258 return false;
259 }
260
261 void shrink_to_fit() { resize_internal(this->len, true, true); }
262
263 int capacity() { return this->max_capacity; }
264
265 bool resize(int newSize) {
266 int oldSize = this->len;
267 resize_internal(newSize, true);
268 this->len = newSize;
269 return this->len != oldSize;
270 }
271
272 Iterator begin() { return Iterator(p_data, 0); }
273
274 T &back() { return *Iterator(p_data + (len - 1), len - 1); }
275
276 Iterator end() { return Iterator(p_data + len, len); }
277
278 // removes a single element
279 void erase(Iterator it) { return erase(it.pos()); }
280
281 // removes a single element
282 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]),
289 lenToEnd * sizeof(T));
290
291 // make sure that we have a valid object at the end
292 // p_data[len - 1] = T();
293 new (&(p_data[len - 1])) T();
294 len--;
295 }
296 }
297
298 T *data() { return p_data; }
299
300 operator bool() const { return p_data != nullptr; }
301
302 int indexOf(T obj) {
303 for (int j = 0; j < size(); j++) {
304 if (p_data[j] == obj) return j;
305 }
306 return -1;
307 }
308
309 bool contains(T obj) { return indexOf(obj) >= 0; }
310
311 void swap(T &other) {
312 // save values
313 int temp_blen = max_capacity;
314 int temp_len = len;
315 T *temp_data = p_data;
316 // swap from other
317 max_capacity = other.bufferLen;
318 len = other.len;
319 p_data = other.p_data;
320 // set other
321 other.bufferLen = temp_blen;
322 other.len = temp_len;
323 other.p_data = temp_data;
324 }
325
326 void reset() {
327 clear();
329 deleteArray(p_data, size()); // delete [] this->p_data;
330 p_data = nullptr;
331 }
332
333 protected:
335 int len = 0;
336 T *p_data = nullptr;
337 Allocator *p_allocator = &DefaultAllocator;
338
339 void resize_internal(int newSize, bool copy, bool shrink = false) {
340 if (newSize <= 0) return;
341 if (newSize > max_capacity || this->p_data == nullptr || shrink) {
342 T *oldData = p_data;
343 int oldBufferLen = this->max_capacity;
344 p_data = newArray(newSize); // new T[newSize+1];
345 assert(p_data != nullptr);
346 this->max_capacity = newSize;
347 if (oldData != nullptr) {
348 if (copy && this->len > 0) {
349 // save existing data
350 memmove((void *)p_data, (void *)oldData, len * sizeof(T));
351 // clear to prevent double release
352 memset((void *)oldData, 0, len * sizeof(T));
353 }
354 if (shrink) {
355 cleanup(oldData, newSize, oldBufferLen);
356 }
357 deleteArray(oldData, oldBufferLen); // delete [] oldData;
358 }
359 }
360 }
361
362 T *newArray(int newSize) {
363 T *data;
364#if USE_ALLOCATOR
365 data = p_allocator->createArray<T>(newSize); // new T[newSize+1];
366#else
367 data = new T[newSize];
368#endif
369 return data;
370 }
371
372 void deleteArray(T *oldData, int oldBufferLen) {
373 if (oldData == nullptr) return;
374#if USE_ALLOCATOR
375 p_allocator->removeArray(oldData, oldBufferLen); // delete [] oldData;
376#else
377 delete[] oldData;
378#endif
379 }
380
381 void cleanup(T *data, int from, int to) {
382 for (int j = from; j < to; j++) {
383 data[j].~T();
384 }
385 }
386};
387
388} // namespace tiny_dlna
Memory allocateator which uses malloc.
Definition: Allocator.h:21
void removeArray(T *obj, int len)
Definition: Allocator.h:52
T * createArray(int len)
Definition: Allocator.h:42
Lightweight iterator for tiny_dlna::Vector<T>.
Definition: Vector.h:33
Iterator(const Iterator &copyFrom)
Definition: Vector.h:45
bool operator<(Iterator it)
Definition: Vector.h:74
T * operator->()
Definition: Vector.h:80
size_t pos()
Definition: Vector.h:82
Iterator operator--()
Definition: Vector.h:64
T & operator*()
Definition: Vector.h:79
T * getPtr()
Definition: Vector.h:81
size_t operator-(Iterator it)
Definition: Vector.h:83
bool operator>(Iterator it)
Definition: Vector.h:76
bool operator<=(Iterator it)
Definition: Vector.h:75
Iterator operator--(int n)
Definition: Vector.h:59
T * ptr
Definition: Vector.h:35
Iterator(T *parPtr, size_t pos)
Definition: Vector.h:40
Iterator operator+(int offset)
Definition: Vector.h:69
size_t pos_
Definition: Vector.h:36
bool operator!=(Iterator it)
Definition: Vector.h:78
Iterator operator++()
Definition: Vector.h:54
Iterator()
Definition: Vector.h:39
bool operator>=(Iterator it)
Definition: Vector.h:77
Iterator operator++(int n)
Definition: Vector.h:49
bool operator==(Iterator it)
Definition: Vector.h:73
Vector implementation which provides the most important methods as defined by std::vector....
Definition: Vector.h:21
virtual ~Vector()
Destructor.
Definition: Vector.h:161
void erase(int pos)
Definition: Vector.h:282
void resize_internal(int newSize, bool copy, bool shrink=false)
Definition: Vector.h:339
void swap(T &other)
Definition: Vector.h:311
Allocator * p_allocator
Definition: Vector.h:337
void clear()
Definition: Vector.h:165
void cleanup(T *data, int from, int to)
Definition: Vector.h:381
bool resize(int newSize, T value)
Definition: Vector.h:251
bool empty()
Definition: Vector.h:169
void assign(size_t number, T value)
Definition: Vector.h:221
Vector(Vector< T > &&moveFrom)
Move constructor.
Definition: Vector.h:118
Vector(T *from, T *to, Allocator &allocator=DefaultAllocator)
legacy constructor with pointer range
Definition: Vector.h:151
Vector(Allocator &allocator)
Constructor with only allocator.
Definition: Vector.h:106
void reset()
Definition: Vector.h:326
int size()
Definition: Vector.h:167
bool contains(T obj)
Definition: Vector.h:309
void push_back(T &&value)
Definition: Vector.h:171
T * newArray(int newSize)
Definition: Vector.h:362
T & operator[](int index)
Definition: Vector.h:244
void assign(Iterator v1, Iterator v2)
Definition: Vector.h:211
Iterator end()
Definition: Vector.h:276
bool resize(int newSize)
Definition: Vector.h:265
T & operator[](const int index) const
Definition: Vector.h:249
void swap(Vector< T > &in)
Definition: Vector.h:229
void pop_front()
Definition: Vector.h:209
void erase(Iterator it)
Definition: Vector.h:279
T & back()
Definition: Vector.h:274
Vector< T > & operator=(Vector< T > &copyFrom)
copy operator
Definition: Vector.h:141
int indexOf(T obj)
Definition: Vector.h:302
void push_front(T &value)
Definition: Vector.h:183
Vector & operator=(Vector &&moveFrom)
Move operator.
Definition: Vector.h:124
void push_front(T &&value)
Definition: Vector.h:193
int max_capacity
Definition: Vector.h:334
int len
Definition: Vector.h:335
void shrink_to_fit()
Definition: Vector.h:261
T * p_data
Definition: Vector.h:336
Iterator begin()
Definition: Vector.h:272
T * data()
Definition: Vector.h:298
void deleteArray(T *oldData, int oldBufferLen)
Definition: Vector.h:372
void push_back(T &value)
Definition: Vector.h:177
Vector(int size, T value, Allocator &allocator=DefaultAllocator)
Allocate size and initialize array.
Definition: Vector.h:109
void pop_back()
Definition: Vector.h:203
Vector(Vector< T > &copyFrom)
copy constructor
Definition: Vector.h:131
int capacity()
Definition: Vector.h:263
Vector(size_t len=0, Allocator &allocator=DefaultAllocator)
Default constructor: size 0 with DefaultAllocator.
Definition: Vector.h:100
void setAllocator(Allocator &allocator)
Definition: Vector.h:163
Definition: Allocator.h:6