00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <config.h>
00019 #include <algorithm>
00020 #include <drizzled/dynamic_array.h>
00021 #include <drizzled/internal/my_sys.h>
00022
00023 using namespace std;
00024
00025 namespace drizzled {
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 bool init_dynamic_array2(DYNAMIC_ARRAY *array, uint32_t element_size,
00050 void *init_buffer, uint32_t init_alloc,
00051 uint32_t alloc_increment)
00052 {
00053 if (!alloc_increment)
00054 {
00055 alloc_increment=max((8192-MALLOC_OVERHEAD)/element_size,16U);
00056 if (init_alloc > 8 && alloc_increment > init_alloc * 2)
00057 alloc_increment=init_alloc*2;
00058 }
00059
00060 if (!init_alloc)
00061 {
00062 init_alloc=alloc_increment;
00063 init_buffer= 0;
00064 }
00065 array->set_size(0);
00066 array->max_element=init_alloc;
00067 array->alloc_increment=alloc_increment;
00068 array->size_of_element=element_size;
00069 if ((array->buffer= (unsigned char*) init_buffer))
00070 return(false);
00071 if (!(array->buffer=(unsigned char*) malloc(element_size*init_alloc)))
00072 {
00073 array->max_element=0;
00074 return(true);
00075 }
00076 return(false);
00077 }
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 static void insert_dynamic(DYNAMIC_ARRAY *array, void* element)
00093 {
00094 unsigned char* buffer;
00095 if (array->size() == array->max_element)
00096 buffer= alloc_dynamic(array);
00097 else
00098 {
00099 buffer= array->buffer+(array->size() * array->size_of_element);
00100 array->set_size(array->size() + 1);
00101 }
00102 memcpy(buffer,element, array->size_of_element);
00103 }
00104
00105 void DYNAMIC_ARRAY::push_back(void* v)
00106 {
00107 insert_dynamic(this, v);
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 unsigned char *alloc_dynamic(DYNAMIC_ARRAY *array)
00129 {
00130 if (array->size() == array->max_element)
00131 {
00132 char *new_ptr;
00133 if (array->buffer == (unsigned char *)(array + 1))
00134 {
00135
00136
00137
00138
00139 if (!(new_ptr= (char *) malloc((array->max_element+
00140 array->alloc_increment) *
00141 array->size_of_element)))
00142 return 0;
00143 memcpy(new_ptr, array->buffer,
00144 array->size() * array->size_of_element);
00145 }
00146 else if (!(new_ptr= (char*) realloc(array->buffer,
00147 (array->max_element+
00148 array->alloc_increment)*
00149 array->size_of_element)))
00150 return 0;
00151 array->buffer= (unsigned char*) new_ptr;
00152 array->max_element+=array->alloc_increment;
00153 }
00154 array->set_size(array->size() + 1);
00155 return array->buffer + ((array->size() - 1) * array->size_of_element);
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171 unsigned char *pop_dynamic(DYNAMIC_ARRAY *array)
00172 {
00173 if (!array->size())
00174 return 0;
00175 array->set_size(array->size() - 1);
00176 return array->buffer+(array->size() * array->size_of_element);
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187 void delete_dynamic(DYNAMIC_ARRAY *array)
00188 {
00189
00190
00191
00192 if (array->buffer == (unsigned char *)(array + 1))
00193 array->set_size(0);
00194 else
00195 if (array->buffer)
00196 {
00197 free(array->buffer);
00198 array->buffer=0;
00199 array->set_size(array->max_element=0);
00200 }
00201 }
00202
00203 }