MeshNet  1.0.0
meshVariableArray.h
Go to the documentation of this file.
1 
16 #ifndef MESH_VARIABLE_ARRAY_H
17 #define MESH_VARIABLE_ARRAY_H
18 
19 #include "meshHelper.h"
20 
21 
31 template<typename T>
33 public:
34 
39 
40  }
41 
47  MeshVariableArray(const uint16_t length) {
48  ResizeArray(length, true);
49  }
50 
57  MeshVariableArray(const T* newData, const uint16_t newDataLength) {
58  SetArray(newData, newDataLength);
59  }
60 
67  MeshVariableArray(const T fillItem, const uint16_t length) {
68  ResizeArray(length, true);
69  FillArray(fillItem);
70  }
71 
76  CopyFrom(mva);
77  }
78 
83  MoveFrom(mva);
84  }
85 
90  Clear();
91  }
92 
97  CopyFrom(mva);
98  return *this;
99  }
100 
105  MoveFrom(mva);
106  return *this;
107  }
108 
109 
113  inline uint16_t Length() const{
114  return DataLength;
115  }
116 
117  T operator [](uint16_t i) const{
118  return Data[i];
119  }
120 
121  T& operator [](uint16_t i) {
122  return Data[i];
123  }
124 
130  T GetAt(uint16_t index) const {
131  Data[index];
132  }
133 
140  bool SetAt(uint16_t index, T value) {
141  if (index < DataLength) {
142  Data[index] = value;
143  return true;
144  }
145  else return false;
146  }
147 
154  bool SetArray(const T* newData, const uint16_t newDataLength) {
155  //Array resizing if needed
156  if (DataLength != newDataLength) {
157  if (!ResizeArray(newDataLength, true)) {
158  return false;
159  }
160  }
161 
162  //Data copying
163  memcpy(Data, newData, newDataLength * sizeof(T));
164  return true;
165  }
166 
174  bool SetData(const T* newData, uint16_t startIndex, const uint16_t newDataLength) {
175  uint16_t maxLength = startIndex + newDataLength;
176  if (maxLength > DataLength) {
177  //Array expand needed
178  if (!ResizeArray(maxLength, false)) {
179  return false;
180  }
181  }
182 
183  //Data copying
184  memcpy(Data + startIndex * sizeof(T), newData, newDataLength * sizeof(T));
185  return true;
186  }
187 
192  void FillArray(const T fillItem) {
193  for (uint16_t i = 0; i < DataLength; i++) {
194  Data[i] = fillItem;
195  }
196  }
197 
206  bool FillData(const T fillItem, uint16_t startIndex, uint16_t count) {
207  uint16_t maxLength = startIndex + count;
208  if (maxLength > DataLength) {
209  //Array expand needed
210  if (!ResizeArray(maxLength, false)) {
211  return false;
212  }
213  }
214 
215  for (uint16_t i = startIndex; i < maxLength; i++) {
216  Data[i] = fillItem;
217  }
218  return true;
219  }
220 
226  void GetData(T* data, uint16_t& dataLength) const {
227  dataLength = (dataLength > DataLength) ? DataLength : dataLength;
228  memcpy(data, Data, dataLength * sizeof(T));
229  }
230 
237  bool ResizeArray(uint16_t size, bool doNotCopy = false) {
238  if (size > 32767) //Payload limit exceeded
239  return false;
240  if (size == 0) {
241  Clear();
242  return true;
243  }
244 
245  T* newPayloadPtr = NULL;
246  if (doNotCopy) {
247  Clear();
248  newPayloadPtr = (T*)malloc(size * sizeof(T));
249  }
250  else {
251  //just use realloc
252  newPayloadPtr = (T*)realloc(Data, size * sizeof(T));
253  }
254 
255  if (newPayloadPtr != NULL) {
256  //Allocation was successful
257  Data = newPayloadPtr;
258  DataLength = size;
259  return true;
260  }
261  else {
262  //Allocation error
263  return false;
264  }
265  }
266 
270  void Clear() {
271  if (Data != NULL) {
272  free(Data);
273  Data = NULL;
274  }
275  DataLength = 0;
276  }
277 
283  bool CopyFrom(const MeshVariableArray<T>& another) {
284  Clear();
285  return SetData(another.d_ptr(), another.Length());
286  }
287 
294  Clear();
295  Data = another.Data;
296  DataLength = another.DataLength;
297  another.Data = NULL;
298  another.DataLength = 0;
299  }
300 
306  void MoveFrom(T*& dataPtr, uint16_t dataLength) {
307  Clear();
308  Data = dataPtr;
309  DataLength = dataLength;
310  dataPtr = NULL;
311  }
312 
319  inline T* UnsafeDataMove() {
320  T* ptr = Data;
321  Data = NULL;
322  DataLength = 0;
323  return ptr;
324  }
325 
330  inline const T* d_ptr() const{
331  return Data;
332  }
333 
334 protected:
335 
339  T* Data = NULL;
340 
344  uint16_t DataLength = 0;
345 };
346 
347 #endif // !MESH_VARIABLE_ARRAY_H
MeshVariableArray::operator=
MeshVariableArray< T > & operator=(MeshVariableArray< T > &&mva) noexcept
Move assignment operator.
Definition: meshVariableArray.h:104
MeshVariableArray::SetArray
bool SetArray(const T *newData, const uint16_t newDataLength)
Sets new data to whole and resizes (expand/shrink) it.
Definition: meshVariableArray.h:154
MeshVariableArray::MeshVariableArray
MeshVariableArray(const uint16_t length)
Create uninitialized array with specified length.
Definition: meshVariableArray.h:47
MeshVariableArray::MeshVariableArray
MeshVariableArray(const MeshVariableArray< T > &mva)
Copy constructor.
Definition: meshVariableArray.h:75
MeshVariableArray::Length
uint16_t Length() const
Length of data.
Definition: meshVariableArray.h:113
MeshVariableArray::DataLength
uint16_t DataLength
Length of current data.
Definition: meshVariableArray.h:344
MeshVariableArray::SetAt
bool SetAt(uint16_t index, T value)
Sets item at specified index.
Definition: meshVariableArray.h:140
MeshVariableArray::MeshVariableArray
MeshVariableArray(const T fillItem, const uint16_t length)
Fills whole array with the specified item.
Definition: meshVariableArray.h:67
MeshVariableArray::~MeshVariableArray
~MeshVariableArray()
Destructor.
Definition: meshVariableArray.h:89
MeshVariableArray::GetData
void GetData(T *data, uint16_t &dataLength) const
Gets data from whole array.
Definition: meshVariableArray.h:226
MeshVariableArray::d_ptr
const T * d_ptr() const
Pointer to data.
Definition: meshVariableArray.h:330
MeshVariableArray::MoveFrom
void MoveFrom(T *&dataPtr, uint16_t dataLength)
Moves data from another array to current array.
Definition: meshVariableArray.h:306
MeshVariableArray::SetData
bool SetData(const T *newData, uint16_t startIndex, const uint16_t newDataLength)
Sets new data. Array will be expanded if data won't fit.
Definition: meshVariableArray.h:174
MeshVariableArray::Data
T * Data
Pointer to array of data.
Definition: meshVariableArray.h:339
MeshVariableArray
This class safetly handles allocation and deallocation of memory. It can be used in conjunction with ...
Definition: meshVariableArray.h:32
meshHelper.h
This file contains classes and structures that supports meshNet.
MeshVariableArray::operator=
MeshVariableArray< T > & operator=(const MeshVariableArray< T > &mva)
Copy assignment operator.
Definition: meshVariableArray.h:96
MeshVariableArray::Clear
void Clear()
Sets array size to 0.
Definition: meshVariableArray.h:270
MeshVariableArray::UnsafeDataMove
T * UnsafeDataMove()
Takes pointer to allocated array and removes that pointer from current class.
Definition: meshVariableArray.h:319
MeshVariableArray::ResizeArray
bool ResizeArray(uint16_t size, bool doNotCopy=false)
Resizes array.
Definition: meshVariableArray.h:237
MeshVariableArray::CopyFrom
bool CopyFrom(const MeshVariableArray< T > &another)
Copyies data from another array to current array.
Definition: meshVariableArray.h:283
MeshVariableArray::MeshVariableArray
MeshVariableArray(const T *newData, const uint16_t newDataLength)
Sets new data to whole and sets its size.
Definition: meshVariableArray.h:57
MeshVariableArray::MeshVariableArray
MeshVariableArray(MeshVariableArray< T > &&mva) noexcept
Move constructor.
Definition: meshVariableArray.h:82
MeshVariableArray::FillArray
void FillArray(const T fillItem)
Fills whole array with the specified item.
Definition: meshVariableArray.h:192
MeshVariableArray::MoveFrom
void MoveFrom(MeshVariableArray< T > &another)
Moves data from another array to current array.
Definition: meshVariableArray.h:293
MeshVariableArray::FillData
bool FillData(const T fillItem, uint16_t startIndex, uint16_t count)
Fills specified part of array with the specified item. Array can be expanded when startIndex + count ...
Definition: meshVariableArray.h:206
MeshVariableArray::operator[]
T operator[](uint16_t i) const
Definition: meshVariableArray.h:117
MeshVariableArray::GetAt
T GetAt(uint16_t index) const
Reads item at specified index.
Definition: meshVariableArray.h:130
MeshVariableArray::MeshVariableArray
MeshVariableArray()
Constructor.
Definition: meshVariableArray.h:38