12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
16
/* Handling of arrays that can grow dynamicly. */
19
#include "drizzled/internal/my_sys.h"
20
#include "drizzled/internal/m_string.h"
19
22
#include <algorithm>
20
#include <drizzled/dynamic_array.h>
21
#include <drizzled/internal/my_sys.h>
23
24
using namespace std;
29
static bool allocate_dynamic(DYNAMIC_ARRAY *array, uint32_t max_elements);
28
32
Initiate dynamic array
87
static void insert_dynamic(DYNAMIC_ARRAY *array, void* element)
96
bool insert_dynamic(DYNAMIC_ARRAY *array, unsigned char* element)
89
98
unsigned char* buffer;
90
if (array->size() == array->max_element)
91
buffer= alloc_dynamic(array);
99
if (array->elements == array->max_element)
100
{ /* Call only when nessesary */
101
if (!(buffer=alloc_dynamic(array)))
94
buffer= array->buffer+(array->size() * array->size_of_element);
95
array->set_size(array->size() + 1);
106
buffer=array->buffer+(array->elements * array->size_of_element);
97
memcpy(buffer,element, array->size_of_element);
100
void DYNAMIC_ARRAY::push_back(void* v)
102
insert_dynamic(this, v);
109
memcpy(buffer,element,(size_t) array->size_of_element);
131
139
In this senerio, the buffer is statically preallocated,
132
140
so we have to create an all-new malloc since we overflowed
134
new_ptr= (char*) malloc((array->max_element + array->alloc_increment) * array->size_of_element);
135
memcpy(new_ptr, array->buffer, array->size() * array->size_of_element);
142
if (!(new_ptr= (char *) malloc((array->max_element+
143
array->alloc_increment) *
144
array->size_of_element)))
146
memcpy(new_ptr, array->buffer,
147
array->elements * array->size_of_element);
138
new_ptr= (char*) realloc(array->buffer, (array->max_element + array->alloc_increment) * array->size_of_element);
149
else if (!(new_ptr= (char*) realloc(array->buffer,
151
array->alloc_increment)*
152
array->size_of_element)))
139
154
array->buffer= (unsigned char*) new_ptr;
140
155
array->max_element+=array->alloc_increment;
142
array->set_size(array->size() + 1);
143
return array->buffer + ((array->size() - 1) * array->size_of_element);
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);
147
286
Empty array by freeing all memory