20 #include <drizzled/dynamic_array.h>
21 #include <drizzled/internal/my_sys.h>
49 static void init_dynamic_array2(DYNAMIC_ARRAY* array, uint32_t element_size, uint32_t init_alloc, uint32_t alloc_increment)
53 alloc_increment= max((8192 - MALLOC_OVERHEAD) / element_size, 16U);
54 if (init_alloc > 8 && alloc_increment > init_alloc * 2)
55 alloc_increment= init_alloc * 2;
58 init_alloc= alloc_increment;
60 array->max_element= init_alloc;
61 array->alloc_increment= alloc_increment;
62 array->size_of_element= element_size;
63 array->buffer= (
unsigned char*) malloc(element_size * init_alloc);
66 void DYNAMIC_ARRAY::init(uint32_t element_size, uint32_t init_alloc, uint32_t alloc_increment0)
68 init_dynamic_array2(
this, element_size, init_alloc, alloc_increment0);
84 static void insert_dynamic(DYNAMIC_ARRAY* array,
void* element)
86 unsigned char* buffer;
87 if (array->size() == array->max_element)
88 buffer= array->alloc();
91 buffer= array->buffer+(array->size() * array->size_of_element);
92 array->set_size(array->size() + 1);
94 memcpy(buffer,element, array->size_of_element);
97 void DYNAMIC_ARRAY::push_back(
void* v)
99 insert_dynamic(
this, v);
120 static unsigned char* alloc_dynamic(DYNAMIC_ARRAY* array)
122 if (array->size() == array->max_element)
125 if (array->buffer == (
unsigned char*)(array + 1))
131 new_ptr= (
char*) malloc((array->max_element + array->alloc_increment) * array->size_of_element);
132 memcpy(new_ptr, array->buffer, array->size() * array->size_of_element);
135 new_ptr= (
char*) realloc(array->buffer, (array->max_element + array->alloc_increment) * array->size_of_element);
136 array->buffer= (
unsigned char*) new_ptr;
137 array->max_element+=array->alloc_increment;
139 array->set_size(array->size() + 1);
140 return array->buffer + ((array->size() - 1) * array->size_of_element);
143 unsigned char* DYNAMIC_ARRAY::alloc()
145 return alloc_dynamic(
this);
156 static void delete_dynamic(DYNAMIC_ARRAY* array)
161 if (array->buffer == (
unsigned char*)(array + 1))
163 else if (array->buffer)
167 array->set_size(array->max_element=0);
171 void DYNAMIC_ARRAY::free()
173 delete_dynamic(
this);