00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef __AVR_CPP_DYNAMIC_ARRAY_H__
00029 #define __AVR_CPP_DYNAMIC_ARRAY_H__
00030
00031 #include <stdlib.h>
00032 #include "BaseArray.h"
00033
00034
00035
00036
00037
00038
00039
00040
00041 namespace AVRCpp
00042 {
00043 namespace Collection
00044 {
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 template <
00057 typename DataType,
00058 typename SizeType,
00059 SizeType array_capacity = (1 << (sizeof(SizeType) << 3)) - 1,
00060 SizeType reserve_size = 8,
00061 SizeType block_size = 8>
00062
00063 class DynamicArray : public BaseArray<DataType, SizeType, DataType*>
00064 {
00065 protected:
00066 SizeType allocated_size;
00067
00071 bool Realloc(SizeType size)
00072 {
00073
00074 if (size < reserve_size) size = reserve_size;
00075
00076
00077 if (this->allocated_size == size) return true;
00078
00079
00080 DataType *newData = (DataType *) realloc(this->data, sizeof(DataType) * size);
00081 if (newData)
00082 {
00083 this->data = newData;
00084 this->allocated_size = size;
00085 return true;
00086 }
00087
00088 return false;
00089 }
00090
00091 public:
00092
00096 DynamicArray()
00097 {
00098 BaseArray<DataType, SizeType, DataType*>();
00099
00100 this->data = (DataType *) malloc(reserve_size);
00101 this->allocated_size = 0;
00102 }
00103
00107 ~DynamicArray()
00108 {
00109 free(this->data);
00110 }
00111
00115 bool Resize(const SizeType size, const DataType &values = DataType())
00116 {
00117
00118 if (size >= array_capacity) return false;
00119
00120 if (!this->Realloc(size)) return false;
00121
00122 return BaseArray<DataType, SizeType, DataType*>::Resize(size, values);
00123 }
00124
00128 bool Add(const DataType &value)
00129 {
00130
00131 if (this->current_size >= array_capacity) return false;
00132
00133
00134 if (this->current_size >= this->allocated_size)
00135 {
00136 if (!this->Realloc(this->current_size + block_size)) return false;
00137 }
00138
00139 return BaseArray<DataType, SizeType, DataType*>::Add(value);
00140 }
00141
00145 bool Insert(const DataType &value, const SizeType pos)
00146 {
00147
00148 if (this->current_size >= array_capacity) return false;
00149
00150
00151 if (pos > this->current_size) return false;
00152
00153
00154 if (this->current_size >= this->allocated_size)
00155 {
00156 if (!this->Realloc(this->current_size + block_size)) return false;
00157 }
00158
00159 return BaseArray<DataType, SizeType, DataType*>::Insert(value, pos);
00160 }
00161
00165 bool Remove(const SizeType pos)
00166 {
00167 if (!BaseArray<DataType, SizeType, DataType*>::Remove(pos)) return false;
00168
00169
00170 if (this->current_size <= this->allocated_size - block_size)
00171 {
00172
00173 this->Realloc(this->allocated_size - block_size);
00174 }
00175
00176 return true;
00177 }
00178
00182 inline bool Clear()
00183 {
00184 if (!BaseArray<DataType, SizeType, DataType*>::Clear()) return false;
00185
00186
00187 this->Realloc(0);
00188
00189 return true;
00190 }
00191
00195 inline SizeType GetCapacity(void)
00196 {
00197 return array_capacity;
00198 }
00199
00203 inline bool IsFull(void)
00204 {
00205 return (this->current_size == array_capacity);
00206 }
00207
00208 };
00209
00210
00211
00212
00213 }
00214
00215 }
00216
00217
00218
00219
00220 #endif // ifndef __AVR_CPP_DYNAMIC_ARRAY_H__