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