muwerk ustd Library
A low-resource, minimal implementation of Arrays, Maps and Queues for low-resource avrs.
Loading...
Searching...
No Matches
ustd_array.h
1// ustd_array.h - array class
2
3#pragma once
4
31#include "ustd_platform.h"
32
34namespace ustd {
35
36#define ARRAY_INC_SIZE 16
37#define ARRAY_MAX_SIZE UINT_MAX // 65535 or 4294967295 (mostly)
38#define ARRAY_INIT_SIZE 16
39
40// Helper class for array iterators:
41template <typename T> class arrayIterator {
42 private:
43 T *values_ptr;
44 unsigned int position;
45
46 public:
47 arrayIterator(T *values_ptr, unsigned int p) : values_ptr{values_ptr}, position{p} {
48 }
49
50 bool operator!=(const arrayIterator<T> &other) const {
51 return !(*this == other);
52 }
53
54 bool operator==(const arrayIterator<T> &other) const {
55 return position == other.position;
56 }
57
58 arrayIterator &operator++() {
59 ++position;
60 return *this;
61 }
62
63 T &operator*() const {
64 return *(values_ptr + position);
65 }
66};
67
123template <typename T> class array {
124
125 private:
126 T *arr;
127 unsigned int startSize;
128 unsigned int maxSize;
129 unsigned int incSize = ARRAY_INC_SIZE;
130 bool shrink = true;
131 unsigned int allocSize;
132 unsigned int size;
133 T bad = {};
134
135 T *ualloc(unsigned int n) {
136#if defined(__ATTINY__)
137 return (T *)malloc(n * sizeof(T));
138#else
139 return new T[n];
140#endif
141 }
142 void ufree(T *p) {
143#if defined(__ATTINY__)
144 free(p);
145#else
146 delete[] p;
147#endif
148 }
149
150 public:
151 array(unsigned int startSize = ARRAY_INIT_SIZE, unsigned int maxSize = ARRAY_MAX_SIZE,
152 unsigned int incSize = ARRAY_INC_SIZE, bool shrink = true)
153 : startSize(startSize), maxSize(maxSize), incSize(incSize), shrink(shrink) {
168 size = 0;
169 if (maxSize < startSize)
170 maxSize = startSize;
171 allocSize = startSize;
172 arr = ualloc(allocSize); // new T[allocSize];
173 }
174
175 array(const T initarray[], unsigned int count) {
179 allocSize = count;
180 startSize = count;
181 maxSize = ARRAY_MAX_SIZE;
182 incSize = ARRAY_INC_SIZE;
183 shrink = true;
184 size = count;
185 bad = {};
186 arr = ualloc(allocSize); // new T[allocSize];
187 for (unsigned int i = 0; i < size; i++) {
188 arr[i] = initarray[i];
189 }
190 }
191
192 array(const array<T> &ar) {
194 arr = ualloc(ar.allocSize);
195 if (arr) {
196 // memcpy(arr, ar.arr, ar.size * sizeof(T));
197 startSize = ar.startSize;
198 maxSize = ar.maxSize;
199 incSize = ar.incSize;
200 shrink = ar.shrink;
201 allocSize = ar.allocSize;
202 size = ar.size;
203 bad = ar.bad;
204 for (unsigned int i = 0; i < size; i++) {
205 arr[i] = ar.arr[i];
206 }
207 }
208 }
209
212 if (arr != nullptr) {
213 ufree(arr);
214 arr = nullptr;
215 }
216 }
217
218 // iterators
219 arrayIterator<T> begin() {
221 return arrayIterator<T>(arr, 0);
222 }
223 arrayIterator<T> end() {
225 return arrayIterator<T>(arr, 0 + size);
226 }
227
228 arrayIterator<const T> begin() const {
230 return arrayIterator<const T>(arr, 0);
231 }
232
233 arrayIterator<const T> end() const {
235 return arrayIterator<const T>(arr, 0 + size);
236 }
237
238 bool resize(unsigned int newSize) {
247 unsigned int mv = newSize;
248 if (newSize > maxSize) {
249 if (maxSize == allocSize)
250 return false;
251 else
252 newSize = maxSize;
253 }
254 if (!shrink) {
255 if (newSize <= allocSize)
256 return true;
257 } else {
258 if (newSize < allocSize)
259 mv = newSize;
260 else
261 mv = allocSize;
262 }
263 T *arrn = ualloc(newSize ? newSize : ARRAY_INIT_SIZE); // new T[newSize];
264 if (arrn == nullptr)
265 return false;
266 for (unsigned int i = 0; i < mv; i++) {
267 arrn[i] = arr[i];
268 }
269 ufree(arr);
270 arr = arrn;
271 allocSize = newSize ? newSize : ARRAY_INIT_SIZE;
272 if (newSize < size)
273 size = newSize;
274 return true;
275 }
276
277 void setInvalidValue(T &entryInvalidValue) {
285 bad = entryInvalidValue;
286 }
287
288 int add(T &entry) {
294 if (size >= allocSize) {
295 if (incSize == 0)
296 return -1;
297 if (!resize(allocSize + incSize))
298 return -1;
299 }
300 arr[size] = entry;
301 ++size;
302 return size - 1;
303 }
304
305 bool erase(unsigned int index) {
311 if (index >= size) {
312 return false;
313 }
314 for (unsigned int i = index; i < size - 1; i++) {
315 arr[i] = arr[i + 1];
316 }
317 --size;
318 if (shrink) {
319 if ((size < allocSize - incSize) && (allocSize > incSize)) {
320 resize(allocSize - incSize);
321 }
322 }
323 return true;
324 }
325
326 bool erase() {
330 return resize(0);
331 }
332
333 T operator[](unsigned int i) const {
338 if (i >= size) {
339#if defined (__UNIXOID__)
340 assert(i < size);
341#endif
342 return bad;
343 }
344 return arr[i];
345 }
346
347 T &operator[](unsigned int i) {
349 if (i >= allocSize) {
350#if defined(__UNIXOID__)
351 if (incSize == 0) {
352 assert(i < allocSize);
353 }
354#endif
355 if (!resize(allocSize + incSize)) {
356#if defined(__UNIXOID__)
357 assert(i < allocSize);
358#endif
359 }
360 }
361 if (i >= size && i <= allocSize)
362 size = i + 1;
363 if (i >= allocSize) {
364 return bad;
365 }
366 return arr[i];
367 }
368
369 bool isEmpty() const {
372 if (size == 0)
373 return true;
374 else
375 return false;
376 }
377
378 unsigned int length() const {
381 return (size);
382 }
383 unsigned int alloclen() const {
387 return (allocSize);
388 }
389};
390} // namespace ustd
Lightweight c++11 array implementation.
Definition: ustd_array.h:123
array(const T initarray[], unsigned int count)
Definition: ustd_array.h:175
bool resize(unsigned int newSize)
Definition: ustd_array.h:238
unsigned int alloclen() const
Definition: ustd_array.h:383
arrayIterator< const T > begin() const
Definition: ustd_array.h:228
T operator[](unsigned int i) const
Definition: ustd_array.h:333
bool erase()
Definition: ustd_array.h:326
arrayIterator< T > end()
Definition: ustd_array.h:223
array(unsigned int startSize=ARRAY_INIT_SIZE, unsigned int maxSize=ARRAY_MAX_SIZE, unsigned int incSize=ARRAY_INC_SIZE, bool shrink=true)
Definition: ustd_array.h:151
bool isEmpty() const
Definition: ustd_array.h:369
T & operator[](unsigned int i)
Definition: ustd_array.h:347
bool erase(unsigned int index)
Definition: ustd_array.h:305
arrayIterator< T > begin()
Definition: ustd_array.h:219
void setInvalidValue(T &entryInvalidValue)
Definition: ustd_array.h:277
~array()
Definition: ustd_array.h:210
int add(T &entry)
Definition: ustd_array.h:288
arrayIterator< const T > end() const
Definition: ustd_array.h:233
unsigned int length() const
Definition: ustd_array.h:378
array(const array< T > &ar)
Definition: ustd_array.h:192
The ustd namespace.
Definition: ustd_array.h:34