35 |
35 |
36 static void *cx_array_default_realloc( |
36 static void *cx_array_default_realloc( |
37 void *array, |
37 void *array, |
38 size_t capacity, |
38 size_t capacity, |
39 size_t elem_size, |
39 size_t elem_size, |
40 __attribute__((__unused__)) CxArrayReallocator *alloc |
40 cx_attr_unused CxArrayReallocator *alloc |
41 ) { |
41 ) { |
42 return realloc(array, capacity * elem_size); |
42 return realloc(array, capacity * elem_size); |
43 } |
43 } |
44 |
44 |
45 CxArrayReallocator cx_array_default_reallocator_impl = { |
45 CxArrayReallocator cx_array_default_reallocator_impl = { |
52 |
52 |
53 static void *cx_array_advanced_realloc( |
53 static void *cx_array_advanced_realloc( |
54 void *array, |
54 void *array, |
55 size_t capacity, |
55 size_t capacity, |
56 size_t elem_size, |
56 size_t elem_size, |
57 __attribute__((__unused__)) CxArrayReallocator *alloc |
57 cx_attr_unused CxArrayReallocator *alloc |
58 ) { |
58 ) { |
59 // retrieve the pointer to the actual allocator |
59 // retrieve the pointer to the actual allocator |
60 const CxAllocator *al = alloc->ptr1; |
60 const CxAllocator *al = alloc->ptr1; |
61 |
61 |
62 // check if the array is still located on the stack |
62 // check if the array is still located on the stack |
322 } |
322 } |
323 } |
323 } |
324 |
324 |
325 // report the largest upper bound |
325 // report the largest upper bound |
326 return result < 0 ? (pivot_index - 1) : pivot_index; |
326 return result < 0 ? (pivot_index - 1) : pivot_index; |
|
327 } |
|
328 |
|
329 size_t cx_array_binary_search( |
|
330 const void *arr, |
|
331 size_t size, |
|
332 size_t elem_size, |
|
333 const void *elem, |
|
334 cx_compare_func cmp_func |
|
335 ) { |
|
336 size_t index = cx_array_binary_search_inf( |
|
337 arr, size, elem_size, elem, cmp_func |
|
338 ); |
|
339 if (index < size && |
|
340 cmp_func(((const char *) arr) + index * elem_size, elem) == 0) { |
|
341 return index; |
|
342 } else { |
|
343 return size; |
|
344 } |
|
345 } |
|
346 |
|
347 size_t cx_array_binary_search_sup( |
|
348 const void *arr, |
|
349 size_t size, |
|
350 size_t elem_size, |
|
351 const void *elem, |
|
352 cx_compare_func cmp_func |
|
353 ) { |
|
354 size_t inf = cx_array_binary_search_inf( |
|
355 arr, size, elem_size, elem, cmp_func |
|
356 ); |
|
357 if (inf == size) { |
|
358 // no infimum means, first element is supremum |
|
359 return 0; |
|
360 } else if (cmp_func(((const char *) arr) + inf * elem_size, elem) == 0) { |
|
361 return inf; |
|
362 } else { |
|
363 return inf + 1; |
|
364 } |
327 } |
365 } |
328 |
366 |
329 #ifndef CX_ARRAY_SWAP_SBO_SIZE |
367 #ifndef CX_ARRAY_SWAP_SBO_SIZE |
330 #define CX_ARRAY_SWAP_SBO_SIZE 128 |
368 #define CX_ARRAY_SWAP_SBO_SIZE 128 |
331 #endif |
369 #endif |