8static inline void * __cstl_raw_array_at(
9 const void *
const arr,
10 const size_t size,
const size_t at)
12 return (
void *)((uintptr_t)arr + (at * size));
16 const size_t count,
const size_t size,
22 for (i = 0, j = count - 1; i < j; i++, j--) {
23 swap(__cstl_raw_array_at(arr, size, i),
24 __cstl_raw_array_at(arr, size, j),
31 const size_t count,
const size_t size,
32 const void *
const ex,
38 for (i = 0, j = count - 1; i <= j;) {
39 const int n = (i + j) / 2;
40 const int eq = cmp(ex, __cstl_raw_array_at(arr, size, n), priv);
55 const size_t count,
const size_t size,
56 const void *
const ex,
62 for (i = 0; i < count; i++) {
63 if (cmp(ex, __cstl_raw_array_at(arr, size, i), priv) == 0) {
82static size_t cstl_raw_array_qsort_p(
83 void *
const arr,
const size_t count,
const size_t size,
116 while (cmp(a = __cstl_raw_array_at(arr, size, i), p, priv) < 0) {
124 while (cmp(b = __cstl_raw_array_at(arr, size, j), p, priv) > 0) {
133static void cstl_raw_array_qsort(
134 void *
const arr,
const size_t count,
const size_t size,
171 void *
const beg = __cstl_raw_array_at(arr, size, 0);
172 void *
const end = __cstl_raw_array_at(arr, size, count - 1);
176 mid = __cstl_raw_array_at(arr, size, p);
186 if (cmp(end, beg, priv) < 0) {
187 swap(end, beg, tmp, size);
189 if (cmp(mid, beg, priv) < 0) {
190 swap(mid, beg, tmp, size);
191 }
else if (cmp(end, mid, priv) < 0) {
192 swap(end, mid, tmp, size);
204 const size_t m = cstl_raw_array_qsort_p(
206 __cstl_raw_array_at(arr, size, p),
216 cstl_raw_array_qsort(
221 cstl_raw_array_qsort(
222 __cstl_raw_array_at(arr, size, m + 1), count - m - 1, size,
242static void cstl_raw_array_hsort_b(
243 void *
const arr,
const size_t count,
const size_t size,
259 swap(__cstl_raw_array_at(arr, size, n),
260 __cstl_raw_array_at(arr, size, c),
280 && cmp(__cstl_raw_array_at(arr, size, l),
281 __cstl_raw_array_at(arr, size, c),
286 && cmp(__cstl_raw_array_at(arr, size, r),
287 __cstl_raw_array_at(arr, size, c),
295void cstl_raw_array_hsort(
296 void *
const arr,
const size_t count,
const size_t size,
317 for (i = count / 2 - 1; i >= 0; i--) {
318 cstl_raw_array_hsort_b(
319 arr, count, size, i, cmp, priv, swap, tmp);
332 for (i = count - 1; i > 0; i--) {
333 swap(arr, __cstl_raw_array_at(arr, size, i), tmp, size);
334 cstl_raw_array_hsort_b(
335 arr, i, size, 0, cmp, priv, swap, tmp);
341 void *
const arr,
const size_t count,
const size_t size,
350 cstl_raw_array_qsort(arr, count, size, cmp, priv, swap, tmp, algo);
353 cstl_raw_array_hsort(arr, count, size, cmp, priv, swap, tmp);
357 arr, count, size, cmp, priv, swap, tmp,
377 const size_t nm,
const size_t sz)
379 struct cstl_raw_array * ra;
396 void *
const buf,
const size_t nm,
const size_t sz)
398 struct cstl_raw_array * ra;
411 const struct cstl_raw_array *
const ra =
429 const struct cstl_raw_array *
const ra =
442 const struct cstl_raw_array *
const ra =
445 return __cstl_raw_array_at(ra->buf, ra->sz, a->off + i);
450 const size_t beg,
const size_t end,
453 const struct cstl_raw_array *
const ra =
458 || a->off + end > ra->nm) {
462 s->off = a->off + beg;
471 const struct cstl_raw_array *
const ra =
485#include "internal/check.h"
539 ck_assert_ptr_eq(p, _);
543START_TEST(access_before)
556START_TEST(access_after)
583START_TEST(invalid_slice)
597Suite * array_suite(
void)
599 Suite *
const s = suite_create(
"array");
603 tc = tcase_create(
"array");
604 tcase_add_test(tc, create);
605 tcase_add_test(tc, slice);
606 tcase_add_test(tc, set);
607 tcase_add_test(tc, access_before);
608 tcase_add_test(tc, access_after);
609 tcase_add_test(tc, big_slice);
610 tcase_add_test(tc, invalid_slice);
612 suite_add_tcase(s, tc);
cstl_sort_algorithm_t
Enumeration indicating the desired sort algorithm.
@ CSTL_SORT_ALGORITHM_QUICK_M
Median-of-three quicksort.
@ CSTL_SORT_ALGORITHM_QUICK
Quicksort.
@ CSTL_SORT_ALGORITHM_HEAP
Heapsort.
@ CSTL_SORT_ALGORITHM_DEFAULT
Unspecified default algorithm.
@ CSTL_SORT_ALGORITHM_QUICK_R
Randomized quicksort.
void cstl_swap_func_t(void *a, void *b, void *t, size_t len)
Type of function called to swap two objects.
int cstl_compare_func_t(const void *obj1, const void *obj2, void *priv)
Function type for comparing (in)equality of two objects.
void cstl_array_alloc(cstl_array_t *const a, const size_t nm, const size_t sz)
Allocate an array to be managed.
ssize_t cstl_raw_array_find(const void *const arr, const size_t count, const size_t size, const void *const ex, cstl_compare_func_t *const cmp, void *const priv)
Perform a linear search of the array.
void cstl_raw_array_sort(void *const arr, const size_t count, const size_t size, cstl_compare_func_t *const cmp, void *const priv, cstl_swap_func_t *const swap, void *const tmp, const cstl_sort_algorithm_t algo)
Sort the array using the specified algorithm.
ssize_t cstl_raw_array_search(const void *const arr, const size_t count, const size_t size, const void *const ex, cstl_compare_func_t *const cmp, void *const priv)
Perform a binary search of the array.
void cstl_array_set(cstl_array_t *const a, void *const buf, const size_t nm, const size_t sz)
Manage an externally allocated array.
static size_t cstl_array_size(const cstl_array_t *const a)
Get the number of elements in the array.
void cstl_array_release(cstl_array_t *const a, void **const buf)
Release an externally allocated array.
static void * cstl_array_data(cstl_array_t *const a)
Return a pointer to the underlying array.
const void * cstl_array_at_const(const cstl_array_t *a, size_t i)
Return a pointer to an element in the array.
const void * cstl_array_data_const(const cstl_array_t *const a)
Return a pointer to the underlying array.
static void cstl_array_reset(cstl_array_t *const a)
Drop a reference to memory managed by this object.
void cstl_array_slice(cstl_array_t *const a, const size_t beg, const size_t end, cstl_array_t *const s)
Create an array object referring to a slice of another.
void cstl_array_unslice(cstl_array_t *const s, cstl_array_t *const a)
Create an array object referring to the entire underlying array.
static void * cstl_array_at(cstl_array_t *const a, const size_t i)
Return a pointer to an element in the array.
void cstl_raw_array_reverse(void *const arr, const size_t count, const size_t size, cstl_swap_func_t *const swap, void *const t)
Reverse the contents of an array.
#define DECLARE_CSTL_ARRAY(NAME)
Declare (and initialize) an array object at compile time.
void cstl_shared_ptr_reset(cstl_shared_ptr_t *sp)
Stop managing the underlying memory via this object.
bool cstl_shared_ptr_unique(const cstl_shared_ptr_t *sp)
Determine if a shared pointer uniquely owns the underlying memory.
static void * cstl_shared_ptr_get(cstl_shared_ptr_t *const sp)
Get a pointer to the memory managed by the object.
void cstl_shared_ptr_share(const cstl_shared_ptr_t *ex, cstl_shared_ptr_t *n)
Create a new shared pointer object to manage the underlying memory.
void cstl_shared_ptr_alloc(cstl_shared_ptr_t *sp, size_t sz, cstl_xtor_func_t *clr)
Dynamically allocated memory to be shared via the object.
const void * cstl_shared_ptr_get_const(const cstl_shared_ptr_t *)
Get a pointer to the memory managed by the object.