31#include "ustd_platform.h"
36#define ARRAY_INC_SIZE 16
37#define ARRAY_MAX_SIZE UINT_MAX
38#define ARRAY_INIT_SIZE 16
41template <
typename T>
class arrayIterator {
44 unsigned int position;
47 arrayIterator(T *values_ptr,
unsigned int p) : values_ptr{values_ptr}, position{p} {
50 bool operator!=(
const arrayIterator<T> &other)
const {
51 return !(*
this == other);
54 bool operator==(
const arrayIterator<T> &other)
const {
55 return position == other.position;
58 arrayIterator &operator++() {
63 T &operator*()
const {
64 return *(values_ptr + position);
127 unsigned int startSize;
128 unsigned int maxSize;
129 unsigned int incSize = ARRAY_INC_SIZE;
131 unsigned int allocSize;
135 T *ualloc(
unsigned int n) {
136#if defined(__ATTINY__)
137 return (T *)malloc(n *
sizeof(T));
143#if defined(__ATTINY__)
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) {
169 if (maxSize < startSize)
171 allocSize = startSize;
172 arr = ualloc(allocSize);
175 array(
const T initarray[],
unsigned int count) {
181 maxSize = ARRAY_MAX_SIZE;
182 incSize = ARRAY_INC_SIZE;
186 arr = ualloc(allocSize);
187 for (
unsigned int i = 0; i < size; i++) {
188 arr[i] = initarray[i];
194 arr = ualloc(ar.allocSize);
197 startSize = ar.startSize;
198 maxSize = ar.maxSize;
199 incSize = ar.incSize;
201 allocSize = ar.allocSize;
204 for (
unsigned int i = 0; i < size; i++) {
212 if (arr !=
nullptr) {
221 return arrayIterator<T>(arr, 0);
225 return arrayIterator<T>(arr, 0 + size);
228 arrayIterator<const T>
begin()
const {
230 return arrayIterator<const T>(arr, 0);
233 arrayIterator<const T>
end()
const {
235 return arrayIterator<const T>(arr, 0 + size);
247 unsigned int mv = newSize;
248 if (newSize > maxSize) {
249 if (maxSize == allocSize)
255 if (newSize <= allocSize)
258 if (newSize < allocSize)
263 T *arrn = ualloc(newSize ? newSize : ARRAY_INIT_SIZE);
266 for (
unsigned int i = 0; i < mv; i++) {
271 allocSize = newSize ? newSize : ARRAY_INIT_SIZE;
285 bad = entryInvalidValue;
294 if (size >= allocSize) {
297 if (!
resize(allocSize + incSize))
314 for (
unsigned int i = index; i < size - 1; i++) {
319 if ((size < allocSize - incSize) && (allocSize > incSize)) {
320 resize(allocSize - incSize);
339#if defined (__UNIXOID__)
349 if (i >= allocSize) {
350#if defined(__UNIXOID__)
352 assert(i < allocSize);
355 if (!
resize(allocSize + incSize)) {
356#if defined(__UNIXOID__)
357 assert(i < allocSize);
361 if (i >= size && i <= allocSize)
363 if (i >= allocSize) {
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