44 #define jm_mangle_ex(name, type) name## _ ##type 45 #define jm_mangle(name, type) jm_mangle_ex(name,type) 48 #define jm_vector(T) jm_mangle(jm_vector, T) 62 #define jm_vector_alloc(T) jm_mangle(jm_vector_alloc, T) 68 #define jm_vector_free(T) jm_mangle(jm_vector_free, T) 82 #define jm_vector_init(T) jm_mangle(jm_vector_init, T) 90 #define jm_vector_free_data(T) jm_mangle(jm_vector_free_data, T) 96 #define jm_vector_get_size(T) jm_mangle(jm_vector_get_size, T) 102 #define jm_vector_get_item(T) jm_mangle(jm_vector_get_item, T) 108 #define jm_vector_get_itemp(T) jm_mangle(jm_vector_get_itemp, T) 115 #define jm_vector_get_last(T) jm_mangle(jm_vector_get_last, T) 121 #define jm_vector_get_lastp(T) jm_mangle(jm_vector_get_lastp, T) 140 #define jm_define_comp_f(F, T, COMPAR_OP) \ 141 static int F (const void* first, const void* second) { \ 142 return COMPAR_OP( (*(T*)first), (*(T*)second)); \ 145 #define jm_diff(first, second) (int)(first-second) 161 #define jm_vector_find(T) jm_mangle(jm_vector_find, T) 162 #define jm_vector_find_index(T) jm_mangle(jm_vector_find_index, T) 170 #define jm_vector_qsort(T) jm_mangle(jm_vector_qsort, T) 180 #define jm_vector_bsearch(T) jm_mangle(jm_vector_bsearch, T) 181 #define jm_vector_bsearch_index(T) jm_mangle(jm_vector_bsearch_index, T) 187 #define jm_vector_set_item(T) jm_mangle(jm_vector_set_item, T) 193 #define jm_vector_zero(T) jm_mangle(jm_vector_zero, T) 205 #define jm_vector_resize(T) jm_mangle(jm_vector_resize, T) 213 #define jm_vector_reserve(T) jm_mangle(jm_vector_reserve, T) 220 #define jm_vector_copy(T) jm_mangle(jm_vector_copy, T) 227 #define jm_vector_clone(T) jm_mangle(jm_vector_clone, T) 234 #define jm_vector_append(T) jm_mangle(jm_vector_append, T) 241 #define jm_vector_insert(T) jm_mangle(jm_vector_insert, T) 248 #define jm_vector_remove_item(T) jm_mangle(jm_vector_remove_item, T) 255 #define jm_vector_resize1(T) jm_mangle(jm_vector_resize1, T) 262 #define jm_vector_push_back(T) jm_mangle(jm_vector_push_back, T) 270 #define jm_vector_foreach(T) jm_mangle(jm_vector_foreach, T) 271 #define jm_vector_foreach_c(T) jm_mangle(jm_vector_foreach_c, T) 276 #define JM_VECTOR_MINIMAL_CAPACITY 16 279 #define JM_VECTOR_MAX_MEMORY_CHUNK 1024 282 #define jm_vector_declare_template(T) \ 283 typedef struct jm_vector(T) { \ 284 jm_callbacks* callbacks; \ 288 T preallocated[JM_VECTOR_MINIMAL_CAPACITY]; \ 291 extern jm_vector(T)* jm_vector_alloc(T)(size_t size,size_t capacity, jm_callbacks*); \ 293 extern size_t jm_vector_copy(T)(jm_vector(T)* destination, jm_vector(T)* source); \ 294 static jm_vector(T)* jm_vector_clone(T)(jm_vector(T)* v) { \ 295 jm_vector(T)* ret = jm_vector_alloc(T)(v->size, v->size, v->callbacks);\ 296 if(ret) jm_vector_copy(T)(ret, v) ; \ 300 extern void jm_vector_free(T)(jm_vector(T) * a); \ 302 extern size_t jm_vector_init(T)(jm_vector(T)* a, size_t size,jm_callbacks*); \ 304 static void jm_vector_free_data(T)(jm_vector(T)* a) { \ 306 if(a->items != a->preallocated) { \ 307 a->callbacks->free((void*)(a->items)); \ 308 a->items = a->preallocated; \ 309 a->capacity=JM_VECTOR_MINIMAL_CAPACITY;\ 315 static size_t jm_vector_get_size(T)(jm_vector(T)* a) { return a->size; } \ 317 static T jm_vector_get_item(T)(jm_vector(T)* a, size_t index) { \ 318 assert(index < a->size); \ 319 return a->items[index]; \ 321 static T* jm_vector_get_itemp(T)(jm_vector(T)* a, size_t index) { \ 322 assert(index < a->size); \ 323 return (a->items+index); \ 325 static T jm_vector_get_last(T)(jm_vector(T)* a) { \ 327 return (a->items[a->size-1]); \ 329 static T* jm_vector_get_lastp(T)(jm_vector(T)* a) { \ 330 if(a->size) return (a->items+(a->size-1)); \ 333 static void jm_vector_set_item(T)(jm_vector(T)* a, size_t index, T item) {\ 334 *(jm_vector_get_itemp(T)(a, index)) = item; \ 336 extern size_t jm_vector_resize(T)(jm_vector(T)* a, size_t size); \ 337 extern size_t jm_vector_reserve(T)(jm_vector(T)* a, size_t capacity); \ 338 extern size_t jm_vector_append(T)(jm_vector(T)* destination, jm_vector(T)* source); \ 339 extern T* jm_vector_insert(T)(jm_vector(T)* a, size_t index, T item);\ 340 extern T* jm_vector_push_back(T)(jm_vector(T)* a, T item);\ 341 extern T* jm_vector_resize1(T)(jm_vector(T)* a);\ 342 extern void jm_vector_remove_item(T)(jm_vector(T)* v, size_t index); \ 343 extern size_t jm_vector_find_index(T)(jm_vector(T)* a, T *itemp, jm_compare_ft f); \ 344 extern T* jm_vector_find(T)(jm_vector(T)* a, T *itemp, jm_compare_ft f); \ 345 extern void jm_vector_qsort(T)(jm_vector(T)* v, jm_compare_ft f); \ 346 extern size_t jm_vector_bsearch_index(T)(jm_vector(T)* v, T* key, jm_compare_ft f); \ 347 extern T* jm_vector_bsearch(T)(jm_vector(T)* v, T* key, jm_compare_ft f); \ 348 extern void jm_vector_foreach(T)(jm_vector(T)* a, void (*f)(T)); \ 349 extern void jm_vector_foreach_c(T)(jm_vector(T)* a, void (*f)(T, void*), void * data); \ 350 extern void jm_vector_zero(T)(jm_vector(T)* a); 355 if(v->size)
return v->items;
374 #define jm_diff_name(a, b) strcmp(a.name,b.name) #define jm_vector_declare_template(T)
void * jm_voidp
A void pointer.
#define jm_diff(first, second)
int(* jm_compare_ft)(const void *, const void *)
Function type for item comparison. Can be generated with jm_define_comp_f.
Mapping between a string and an integer ID.
#define jm_define_comp_f(F, T, COMPAR_OP)
A conveniece macro for comparison function definition.
const char * jm_string
A constant string.
#define jm_vector(T)
jm_vector(T) is the type name (i.e., to be used as jm_vector(int) vi;)
#define jm_diff_name(a, b)