Dynalib Utils
DynaArray.h
Go to the documentation of this file.
1 //
2 // Created by Ken Kopelson on 14/10/17.
3 //
4 
5 #ifndef DYNAARRAY_H
6 #define DYNAARRAY_H
7 
8 #include <exception>
9 #include <type_traits>
10 #include <cstring>
11 #include "TypeDefs.h"
12 #include "ICopyable.h"
13 
14 using namespace std;
15 
16 #define AUTO_PACK 0x01
17 #define PACK_NEEDED 0x02
18 #define AUTO_TRIM 0x04
19 #define END_OF_LIST -1
20 #define INVALID_INDEX -1
21 #define FIRST_FREE -2
22 
23 #define MAKE_ARRAYTYPE_DEF(C, T) \
24  typedef DynaArray<C> T##Array
25 
26 template <class T> class DynaArrayIter;
27 
28 template <class T> class DynaArray : ICopyable< DynaArray<T> > {
29 
30  friend class DynaArrayIter<T>;
31 
32  T* _members = nullptr;
33  uint _capacity = 0;
34  uint _count = 0;
35  uint8_t _flags = AUTO_PACK | AUTO_TRIM;
36 
37  void _insertArray(T *array, int arrayOffset, int toIndex, int count);
38  void _swap(int index1, int index2);
39  DynaArray<T>* _copyRange(int frIndex, int toIndex);
40  void _deleteExcessCapacity();
41  void _deleteRange(int frIndex, int toIndex);
42  void _clearRange(int frIndex, int toIndex);
43  void _deleteOrClear(int frIndex, int toIndex);
44  bool _setAutoPack(bool isPack);
45  bool _setAutoTrim(bool isTrim);
46 
47 protected:
48  inline void setFlags(uint8_t flags) { _flags |= flags; }
49  inline void setAllFlags(uint8_t flags) { _flags = flags; }
50  inline void clearFlags(uint8_t flags) { _flags &= ~flags; }
51  inline void clearAllFlags() { _flags = (uint8_t)0x00; }
52 
53 public:
54  //========================================================================================
55  // Instance Methods
56  //========================================================================================
57  DynaArray() = default;
58  explicit DynaArray(uint initCapacity);
59  explicit DynaArray(T* array, int count);
60  virtual ~DynaArray();
61 
62  DynaArray(const DynaArray<T>& other);
63  DynaArray<T>* copy() override;
64 
65  inline uint getCapacity() { return _capacity; }
66  inline uint getCount() { return _count; }
67  inline uint count() { return _count; }
68  inline bool isFull() { return _count == _capacity; }
69  inline bool isEmpty() { return _count == 0; }
70  inline void trim() { adjustSize(0); }
71  inline T get(uint index) const { return _members[index]; }
72  inline T* getInternalTypedArray() { return _members; }
73  inline void* getInternalRawArray() { return _members; }
74 
75 // T operator[](uint index) { return _members[index]; }
76 // const T operator[](uint index) const { return _members[index]; }
77 // T operator[](uint index) const { return _members[index]; }
78  T operator [](uint index) const { return _members[index]; }
79  T& operator [](uint index) { return _members[index]; }
80 
81  DynaArray<T>& operator= (const DynaArray<T>& array);
82 
83 
85  DynaArray<T>& operator+=(T& value);
86  DynaArray<T>& operator-=(int index);
87 
88  DynaArray<T>& operator<<(T value);
89  DynaArray<T>& operator<<(T& value);
90 
91  void setCapacity(uint newCapacity);
92  void determineTheCount(int invalidValue);
93  void setCount(uint count);
94  void setAutoPackTrim(bool pack, bool trim);
95  void adjustSize(int delta);
96  void adjustSizeLog(int delta);
97  void pack();
98  void clear();
99  int indexOf(T value, uint start, uint step);
100  int indexOf(T* value, uint arraySize, uint start, uint step);
101  int indexOf(T value);
102  int indexOf(T* value, uint arraySize);
103  int revIndexOf(T value, uint start, uint step);
104  int revIndexOf(T* value, uint arraySize, uint start, uint step);
105  int revIndexOf(T value);
106  int revIndexOf(T* value, uint arraySize);
107 
108  int insert(int index, T value);
109  int insert(int index, T* value);
110  int insert(int index, T* values, uint length);
111  int insert(int index, uint8_t* values, uint offset, uint length);
112  int insert(int index, DynaArray<T>* array);
113  int append(T value);
114  int append(T* values, uint length);
115  int append(uint8_t* values, uint offset, uint length);
116  int append(DynaArray<T>* array);
117  T setValue(int index, T value);
118  void move(int index, int destIndex);
119  void slide(int frIndex, int toIndex);
120  T remove(int index);
121  DynaArray<T>* remove(int frIndex, int toIndex);
122  void deleteItem(int index);
123  void deleteItems(int frIndex, int toIndex);
124  void push(T value);
125  T pop();
126  T popLast();
127  DynaArrayIter<T> begin() const;
128  DynaArrayIter<T> end() const;
129 };
130 
131 template <class T> class DynaArrayIter {
132  int _curIndex;
133  int _lastReturned = INVALID_INDEX;
134  const DynaArray<T>* _array;
135 
136 public:
137  DynaArrayIter (const DynaArray<T>* array, int start)
138  : _curIndex(start), _array(array)
139  { }
140 
141  int getIndex() { return _curIndex; }
142  bool hasNext() { return _curIndex < _array->_count; }
143  bool hasPrev() { return _curIndex >= 0; }
144 
145  bool operator== (const DynaArrayIter<T>& other) const {
146  return _curIndex == other._curIndex;
147  }
148 
149  bool operator!= (const DynaArrayIter<T>& other) const {
150  return _curIndex != other._curIndex;
151  }
152 
153  T operator* () const {
154  return _array->get( _curIndex );
155  }
156 
157  const DynaArrayIter<T>& operator++ () {
158  ++_curIndex;
159  return *this;
160  }
161 
162  const DynaArrayIter<T>& operator-- () {
163  --_curIndex;
164  return *this;
165  }
166 };
167 
168 MAKE_ARRAYTYPE_DEF(char, Char);
169 MAKE_ARRAYTYPE_DEF(int, Int);
170 MAKE_ARRAYTYPE_DEF(long, Long);
171 
172 #endif //DYNAARRAY_H
uint getCapacity()
Definition: DynaArray.h:65
GeneratorWrapper< T > values(std::initializer_list< T > values)
Definition: catch.hpp:4009
T * getInternalTypedArray()
Definition: DynaArray.h:72
uint count()
Definition: DynaArray.h:67
CONSTCD11 bool operator==(const day &x, const day &y) NOEXCEPT
Definition: date.h:1274
#define MAKE_ARRAYTYPE_DEF(C, T)
Definition: DynaArray.h:23
bool isEmpty()
Definition: DynaArray.h:69
#define INVALID_INDEX
Definition: DynaArray.h:20
GeneratorWrapper< T > value(T &&value)
Definition: catch.hpp:4005
void clearFlags(uint8_t flags)
Definition: DynaArray.h:50
bool isFull()
Definition: DynaArray.h:68
void trim()
Definition: DynaArray.h:70
#define AUTO_TRIM
Definition: DynaArray.h:18
#define AUTO_PACK
Definition: DynaArray.h:16
Definition: IntWrapper.h:13
std::string trim(std::string const &str)
Returns a new string without whitespace at the start/end.
void setFlags(uint8_t flags)
Definition: DynaArray.h:48
bool hasNext()
Definition: DynaArray.h:142
uint getCount()
Definition: DynaArray.h:66
Definition: DynaArray.h:28
CONSTCD11 bool operator!=(const day &x, const day &y) NOEXCEPT
Definition: date.h:1282
auto operator+=(std::string &lhs, StringRef const &sr) -> std::string &
T get(uint index) const
Definition: DynaArray.h:71
void clearAllFlags()
Definition: DynaArray.h:51
void * getInternalRawArray()
Definition: DynaArray.h:73
DynaArrayIter(const DynaArray< T > *array, int start)
Definition: DynaArray.h:137
std::ostream & operator<<(std::ostream &, Catch_global_namespace_dummy)
int getIndex()
Definition: DynaArray.h:141
Definition: ICopyable.h:8
void setAllFlags(uint8_t flags)
Definition: DynaArray.h:49
Definition: DynaArray.h:26
bool hasPrev()
Definition: DynaArray.h:143