96
bool insert_dynamic(DYNAMIC_ARRAY *array, unsigned char* element)
92
static void insert_dynamic(DYNAMIC_ARRAY *array, void* element)
98
94
unsigned char* buffer;
99
if (array->elements == array->max_element)
100
{ /* Call only when nessesary */
101
if (!(buffer=alloc_dynamic(array)))
95
if (array->size() == array->max_element)
96
buffer= alloc_dynamic(array);
106
buffer=array->buffer+(array->elements * array->size_of_element);
99
buffer= array->buffer+(array->size() * array->size_of_element);
100
array->set_size(array->size() + 1);
109
memcpy(buffer,element,(size_t) array->size_of_element);
102
memcpy(buffer,element, array->size_of_element);
105
void DYNAMIC_ARRAY::push_back(void* v)
107
insert_dynamic(this, v);
154
151
array->buffer= (unsigned char*) new_ptr;
155
152
array->max_element+=array->alloc_increment;
157
return array->buffer+(array->elements++ * array->size_of_element);
162
Pop last element from array.
173
unsigned char *pop_dynamic(DYNAMIC_ARRAY *array)
176
return array->buffer+(--array->elements * array->size_of_element);
181
Replace element in array with given element and index
186
element Element to be inserted
187
idx Index where element is to be inserted
190
set_dynamic() replaces element in array.
191
If idx > max_element insert new element. Allocate memory if needed.
194
true Idx was out of range and allocation of new memory failed
198
bool set_dynamic(DYNAMIC_ARRAY *array, unsigned char* element, uint32_t idx)
200
if (idx >= array->elements)
202
if (idx >= array->max_element && allocate_dynamic(array, idx))
204
memset(array->buffer+array->elements*array->size_of_element, 0,
205
(idx - array->elements)*array->size_of_element);
206
array->elements=idx+1;
208
memcpy(array->buffer+(idx * array->size_of_element),element,
209
(size_t) array->size_of_element);
215
Ensure that dynamic array has enough elements
220
max_elements Numbers of elements that is needed
223
Any new allocated element are NOT initialized
227
true Allocation of new memory failed
230
static bool allocate_dynamic(DYNAMIC_ARRAY *array, uint32_t max_elements)
232
if (max_elements >= array->max_element)
235
unsigned char *new_ptr;
236
size= (max_elements + array->alloc_increment)/array->alloc_increment;
237
size*= array->alloc_increment;
238
if (array->buffer == (unsigned char *)(array + 1))
241
In this senerio, the buffer is statically preallocated,
242
so we have to create an all-new malloc since we overflowed
244
if (!(new_ptr= (unsigned char *) malloc(size *
245
array->size_of_element)))
247
memcpy(new_ptr, array->buffer,
248
array->elements * array->size_of_element);
253
if (!(new_ptr=(unsigned char*) realloc(array->buffer,
254
size* array->size_of_element)))
256
array->buffer= new_ptr;
257
array->max_element= size;
264
Get an element from array by given index
269
unsigned char* Element to be returned. If idx > elements contain zeroes.
270
idx Index of element wanted.
273
void get_dynamic(DYNAMIC_ARRAY *array, unsigned char* element, uint32_t idx)
275
if (idx >= array->elements)
277
memset(element, 0, array->size_of_element);
280
memcpy(element,array->buffer+idx*array->size_of_element,
281
(size_t) array->size_of_element);
154
array->set_size(array->size() + 1);
155
return array->buffer + ((array->size() - 1) * array->size_of_element);
286
159
Empty array by freeing all memory