Fri, 23 May 2025 12:44:24 +0200
make test-compile depend on both static and shared
the shared lib is not needed for the tests,
but when run with coverage, gcov will be confused
when outdated line information is available from
a previous shared build
1143
0559812df10c
assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents:
1142
diff
changeset
|
1 | # Array List |
1141 | 2 | |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
3 | Next to an array list implementation of the list interface, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
4 | UCX offers several functions to work with plain C arrays equipped with a size and a capacity. |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
5 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
6 | The high level [list interface](list.h.md) is documented on a separate page and explains how lists are used |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
7 | that are created by one of the following functions. |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
8 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
9 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
10 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
11 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
12 | CxList *cxArrayListCreate(const CxAllocator *allocator, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
13 | cx_compare_func comparator, size_t elem_size, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
14 | size_t initial_capacity); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
15 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
16 | CxList *cxArrayListCreateSimple(size_t elem_size, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
17 | size_t initial_capacity); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
18 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
19 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
20 | The remaining documentation on this page concentrates on dealing with plain C arrays. |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
21 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
22 | ## Declare Array with Size and Capacity |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
23 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
24 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
25 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
26 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
27 | #define CX_ARRAY_DECLARE_SIZED(type, name, size_type) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
28 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
29 | #define CX_ARRAY_DECLARE(type, name) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
30 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
31 | #define cx_array_initialize(ARRAY, capacity) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
32 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
33 | #define cx_array_initialize_a(allocator, ARRAY, capacity) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
34 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
35 | |
1246
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
36 | The purpose of the UCX array functions is to keep track of the size and capacity of a plain C array. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
37 | |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
38 | The raw functions do not need this information packed into a structure, but working with independent variables is quite cumbersome. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
39 | Therefore, UCX defines several macros that call the raw functions assuming certain variable names. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
40 | |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
41 | This is what the `CX_ARRAY_DECLARE_SIZED()` and `CX_ARRAY_DECLARE()` macros are for. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
42 | They take a `type` for the array members, a `name` for the array variable, and a `size_type` for the type of the size and capacity variables (`size_t` by default when you use `CX_ARRAY_DECLARE()`), |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
43 | and generate three variables named `name`, `name_size`, and `name_capacity`. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
44 | |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
45 | For example, you can abbreviate the following code |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
46 | ```C |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
47 | struct my_data { |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
48 | int other_int; |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
49 | float other_float; |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
50 | int *my_array; |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
51 | size_t my_array_size; |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
52 | size_t my_array_capacity; |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
53 | } |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
54 | ``` |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
55 | by substituting the three members for the array with `CX_ARRAY_DECLARE()`. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
56 | ```C |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
57 | struct my_data { |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
58 | int other_int; |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
59 | float other_float; |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
60 | CX_ARRAY_DECLARE(int, my_array); |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
61 | } |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
62 | ``` |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
63 | |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
64 | > Using `CX_ARRAY_DECLARE_SIZED()` can save some space when you are using a size type that is _half_ as wide as `sizeof(void*)`. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
65 | > On 64-bit architectures, having the possibility to store more than four billion items is rarely necessary, hence using 32-bit integers for size and capacity |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
66 | > saves eight bytes (assuming proper alignment in your struct). |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
67 | |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
68 | Once the array is declared, you can use one of the macros `cx_array_initialize()` or `cx_array_initialize_a()` to allocate memory. |
1318
12fa1d37fe48
allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents:
1248
diff
changeset
|
69 | The former uses the [default allocator](allocator.h.md#default-allocator) and the latter allows you to use a specific allocator. |
1246
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
70 | Important to note is, that the `ARRAY` argument expects the variable's _name_. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
71 | The macros set `ARRAY_size` to zero, `ARRAY_capacity` to the specified initial capacity, and invoke the allocator's `malloc()` function to allocate the memory. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
72 | |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
73 | Using the example from above, and the UCX [memory pool](mempool.h.md), this could look like this: |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
74 | |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
75 | ```C |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
76 | CxMempool *mpool = cxMempoolCreateSimple(128); |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
77 | |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
78 | struct my_data data; |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
79 | cx_array_initialize_a(mpool->allocator, data.my_array, 16); |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
80 | ``` |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
81 | |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
82 | > The aforementioned macros make your life simpler, but keep in mind that using them is not mandatory. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
83 | > All other macros continue to work perfectly, if you declare and initialize your array manually, as long as you use |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
84 | > the naming convention to suffix the size variable with `_size` and the capacity variable with `_capacity`. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
85 | > Also you can freely decide in which order you want to declare the variables. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
86 | > |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
87 | > For example, when you have multiple arrays in your struct with 8-bit `size_type` (because in your use case you don't expect more than 255 elements), |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
88 | > it is favorable to group all pointers and then declare the size and capacity variables to avoid padding between the array declarations. |
1146
151c057faf7c
add marker to every incomplete page
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
89 | |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
90 | ## Array Reallocator |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
91 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
92 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
93 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
94 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
95 | typedef struct { |
1322
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
Mike Becker <universe@uap-core.de>
parents:
1318
diff
changeset
|
96 | void *(*realloc)(void *array, |
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
Mike Becker <universe@uap-core.de>
parents:
1318
diff
changeset
|
97 | size_t old_capacity, size_t new_capacity, |
7be10b57f658
fix critical memory overflow in the stack-based array reallocator
Mike Becker <universe@uap-core.de>
parents:
1318
diff
changeset
|
98 | size_t elem_size, CxArrayReallocator *alloc); |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
99 | void *ptr1; |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
100 | void *ptr2; |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
101 | size_t int1; |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
102 | size_t int2; |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
103 | } CxArrayReallocator; |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
104 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
105 | CxArrayReallocator cx_array_reallocator( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
106 | const struct cx_allocator_s *allocator, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
107 | const void *stackmem |
1141 | 108 | ); |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
109 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
110 | extern CxArrayReallocator* cx_array_default_reallocator; |
1141 | 111 | ``` |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
112 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
113 | The main purpose of the functions defined in the array list header, |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
114 | is to make it easier to write to an array without caring too much about a possibly needed reallocation. |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
115 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
116 | This is realized by passing a reallocator to the various functions which specifies how an array shall be reallocated when needed. |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
117 | |
1318
12fa1d37fe48
allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents:
1248
diff
changeset
|
118 | The default `cx_array_default_reallocator` simply defers to the [default allocator](allocator.h.md#default-allocator). |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
119 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
120 | A reallocator created with the `cx_array_reallocator()` function uses a more sophisticated approach. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
121 | On the one hand, it can use an arbitrary UCX [allocator](allocator.h.md) for the reallocation, |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
122 | and on the other hand, it can optionally keep track of a stack memory pointer. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
123 | If you pass a non-`NULL` pointer to `stackmem`, the reallocator will _always_ allocate _new_ memory for the array, |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
124 | if the current location equals the `stackmem` address. |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
125 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
126 | This allows you to allocate an array on the stack and instruct UCX to automatically move it to heap memory when the capacity is exceeded. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
127 | Combined with a UCX [memory pool](mempool.h.md) this can be a powerful tool for local arrays |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
128 | which are expected to stay within the bounds of the stack memory most of the time, but are also allowed to sometimes grow their capacity when needed. |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
129 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
130 | ## Reserve |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
131 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
132 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
133 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
134 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
135 | int cx_array_reserve( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
136 | void **array, void *size, void *capacity, unsigned width, |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
137 | size_t elem_size, size_t count, |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
138 | CxArrayReallocator *reallocator); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
139 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
140 | #define cx_array_simple_reserve(ARRAY, count) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
141 | #define cx_array_simple_reserve_a(reallocator, ARRAY, count) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
142 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
143 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
144 | The function `cx_array_reserve()` guarantees that at least `count` _additional_ elements |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
145 | can be stored in the array pointed to by `array`. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
146 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
147 | The `array` argument is a pointer to the location of the target array pointer. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
148 | The reason for this additional indirection is that this function writes |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
149 | a new pointer back to that variable, if the array needed to be reallocated. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
150 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
151 | If reallocation fails, this function returns non-zero leaving the array as it was. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
152 | Otherwise, the function returns zero. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
153 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
154 | If `*size + elem_count` does not exceed the current `*capacity`, this function does nothing and simply returns zero. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
155 | Otherwise, the specified `reallocator` is used to reserve the necessary space. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
156 | If reallocation was necessary but failed, this function returns non-zero. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
157 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
158 | The actual data type of `size` and `capacity` can be a pointer to an arbitrary integer whose byte-width is determined by the `width` argument. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
159 | On 32-bit platforms the widths 1, 2, and 4 are supported and on 64-bit platforms, additionally a width of 8 is supported. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
160 | Passing zero as argument makes the function assume the native width for size arguments `sizeof(size_t)`. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
161 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
162 | The convenience macros take the _name_ of an array variable and invoke the function by deducing the other arguments |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
163 | (including the width of the size and capacity). |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
164 | The reallocator used by the `cx_array_simple_reserve()` macro is the `cx_array_default_reallocator`. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
165 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
166 | > While the actual integer type for `size` and `capacity` can be chosen freely, it must be _the same_ for both variables. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
167 | > For example it is not allowed, and it does not make any sense either, to use a 16-bit integer for the size, but a 32-bit integer for the capacity. |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
168 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
169 | ## Copy |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
170 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
171 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
172 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
173 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
174 | int cx_array_copy( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
175 | void **target, void *size, void *capacity, unsigned width, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
176 | size_t index, const void *src, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
177 | size_t elem_size, size_t elem_count, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
178 | CxArrayReallocator *reallocator); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
179 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
180 | #define cx_array_simple_copy(ARRAY, index, src, count) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
181 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
182 | #define cx_array_simple_copy_a(reallocator, ARRAY, index, src, count) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
183 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
184 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
185 | The function `cx_array_copy()` first [reserves](#reserve) enough memory to copy `elem_count` number of elements from the `src` array |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
186 | to the target array at the specified `index`, and then copies the data with one call to `memmove()`. |
1141 | 187 | |
188 | A few things to note: | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
189 | * `*target` and `src` can point to the same memory region, since the underlying copy operation is a `memmove()` |
1141 | 190 | * `*target` does not need to point to the start of the array, but `size` and `capacity` always start counting from the |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
191 | position `*target` points to - in this scenario, the need for reallocation must be avoided for obvious reasons |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
192 | * `index` does not need to be within size and not even within the capacity of the current array |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
193 | * if `index` equals `*size`, this function effectively appends the data to the target array |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
194 | * the data in the target array is overwritten - if you want to insert data, you first need to copy the existing data to the end of the array and then copy the new data in a separate call |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
195 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
196 | > If you are using `cx_array_reserve()` already in your program, there is no need to call `cx_array_copy()` or any of the convenience macros anymore. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
197 | > In other words: if you already guarantee, by any means, that no reallocation is necessary when writing to your array, |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
198 | > it is strongly recommended to use standard library functions or direct index-based access instead of the UCX functions, |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
199 | > which only purpose is to make it easier for you to guarantee that your array's capacity is large enough to hold new elements. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
200 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
201 | ## Add Elements |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
202 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
203 | ```C |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
204 | #include <cx/array_list.h> |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
205 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
206 | #define cx_array_add(target, size, capacity, elem_size, elem, |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
207 | reallocator); |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
208 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
209 | #define cx_array_simple_add(ARRAY, elem) |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
210 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
211 | #define cx_array_simple_add_a(reallocator, ARRAY, elem) |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
212 | ``` |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
213 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
214 | The macros for adding an element are all convenience macros that invoke `cx_array_copy()` |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
215 | interpreting the `elem` as an array of size one, copied to the past-by-one index of the target array. |
1141 | 216 | |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
217 | ## Insertion Sort |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
218 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
219 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
220 | int cx_array_insert_sorted( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
221 | void **target, size_t *size, size_t *capacity, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
222 | cx_compare_func cmp_func, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
223 | const void *src, size_t elem_size, size_t elem_count, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
224 | CxArrayReallocator *reallocator); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
225 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
226 | #define cx_array_simple_insert_sorted(ARRAY, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
227 | src, elem_count, cmp_func) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
228 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
229 | #define cx_array_simple_insert_sorted_a(reallocator, ARRAY, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
230 | src, elem_count, cmp_func) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
231 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
232 | #define cx_array_add_sorted(target, size, capacity, |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
233 | elem_size, elem, cx_compare_func cmp_func, reallocator); |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
234 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
235 | #define cx_array_simple_add_sorted(ARRAY, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
236 | elem, cmp_func) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
237 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
238 | #define cx_array_simple_add_sorted_a(reallocator, ARRAY, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
239 | elem, cmp_func) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
240 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
241 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
242 | The function `cx_array_insert_sorted()` inserts the `elem_count` number of already sorted elements from the `src` array |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
243 | into the target array, comparing the elements with the given `cmp_func`. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
244 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
245 | The arguments of this function are used similar to [`cx_array_copy()`](#copy) with two notable exceptions: |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
246 | first, this function actually inserts the items, moving existing items when necessary, and second, |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
247 | no particular index is required because this function determines the insertion points automatically using [binary search](#binary-search). |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
248 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
249 | If either the target or the source array is not already sorted with respect to the given compare function, the behavior is undefined. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
250 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
251 | The convenience macros are all calling `cx_array_insert_sorted()` by deducing the missing arguments. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
252 | The `cx_array_add_sorted()` family of macros are interpreting the `elem` as a `src` array with an `elem_count` of one. |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
253 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
254 | ## Binary Search |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
255 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
256 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
257 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
258 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
259 | size_t cx_array_binary_search( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
260 | const void *arr, size_t size, size_t elem_size, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
261 | const void *elem, cx_compare_func cmp_func); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
262 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
263 | size_t cx_array_binary_search_inf( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
264 | const void *arr, size_t size, size_t elem_size, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
265 | const void *elem, cx_compare_func cmp_func); |
1142
9437530176bc
add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents:
1141
diff
changeset
|
266 | |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
267 | size_t cx_array_binary_search_sup( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
268 | const void *arr, size_t size, size_t elem_size, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
269 | const void *elem, cx_compare_func cmp_func); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
270 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
271 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
272 | The function `cx_array_binary_search()` searches the array `arr` for the data pointed to by `elem` using the compare function `cmp_func`. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
273 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
274 | If the element is found (i.e. `cmp_func` returns zero), the function returns the index of the element. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
275 | Otherwise, the function returns `size`. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
276 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
277 | The functions `cx_array_binary_search_inf()` and `cx_array_binary_search_sup()` are equivalent, |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
278 | except that they return the index of the closest element, if the searched element is not found. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
279 | The former function returns the closest element that is less or equal (greatest lower bound / infimum), |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
280 | and the latter function returns the closest element that is larger or equal (least upper bound / supremum) |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
281 | than the searched element. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
282 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
283 | > Note, that all of the above functions are only well-defined on arrays which are sorted with respect to the given compare function. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
284 | > |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
285 | > This can, for example, easily be achieved by calling the standard library's `qsort()` function. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
286 | >{style="note"} |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
287 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
288 | > Despite the name, neither C nor POSIX standards require the standard library's `bsearch()` function to be implemented using binary search. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
289 | > But observations show that it usually is. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
290 | > This makes `cx_array_binary_search()` likely to be equivalent to `bsearch()`, except that it returns an index rather than a pointer. |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
291 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
292 | ## Iterators |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
293 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
294 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
295 | #include <cx/iterator.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
296 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
297 | CxIterator cxIterator(const void *array, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
298 | size_t elem_size, size_t elem_count); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
299 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
300 | CxIterator cxMutIterator(void *array, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
301 | size_t elem_size, size_t elem_count, bool remove_keeps_order); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
302 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
303 | CxIterator cxIteratorPtr(const void *array, size_t elem_count); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
304 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
305 | CxIterator cxMutIteratorPtr(void *array, size_t elem_count, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
306 | bool remove_keeps_order); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
307 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
308 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
309 | Iterators over plain C arrays are defined in [iterator.h](iterator.h.md#creating-an-iterator). |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
310 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
311 | ## Other |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
312 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
313 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
314 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
315 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
316 | void cx_array_swap( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
317 | void *arr, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
318 | size_t elem_size, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
319 | size_t idx1, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
320 | size_t idx2 |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
321 | ); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
322 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
323 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
324 | The function `cx_array_swap()` exchanges two items with a three-way swap. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
325 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
326 | No memory is allocated if the element size `elem_size` is not larger than `CX_ARRAY_SWAP_SBO_SIZE` (cf. [](install.md#small-buffer-optimizations)). |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
327 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
328 | You have to make sure that both indices are within bounds of the array `arr`. |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
329 | |
1190
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
330 | <seealso> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
331 | <category ref="apidoc"> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
332 | <a href="https://ucx.sourceforge.io/api/array__list_8h.html">array_list.h</a> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
333 | </category> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
334 | </seealso> |