Sun, 16 Mar 2025 15:23:45 +0100
complete array_list.h documentation
relates to #451
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. |
5f2c9750204c
document declare and init
Mike Becker <universe@uap-core.de>
parents:
1245
diff
changeset
|
69 | The former uses a stdlib default allocator and the latter allows you to use a specific allocator. |
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 { |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
96 | void *(*realloc)(void *array, size_t capacity, size_t elem_size, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
97 | CxArrayReallocator *alloc); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
98 | void *ptr1; |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
99 | void *ptr2; |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
100 | size_t int1; |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
101 | size_t int2; |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
102 | } CxArrayReallocator; |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
103 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
104 | CxArrayReallocator cx_array_reallocator( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
105 | const struct cx_allocator_s *allocator, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
106 | const void *stackmem |
1141 | 107 | ); |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
108 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
109 | extern CxArrayReallocator* cx_array_default_reallocator; |
1141 | 110 | ``` |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
111 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
112 | 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
|
113 | 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
|
114 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
115 | 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
|
116 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
117 | The default `cx_array_default_reallocator` simply defers to the standard library `realloc()`. |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
118 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
119 | 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
|
120 | 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
|
121 | 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
|
122 | 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
|
123 | 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
|
124 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
125 | 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
|
126 | 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
|
127 | 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
|
128 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
129 | ## Reserve |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
130 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
131 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
132 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
133 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
134 | int cx_array_reserve( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
135 | 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
|
136 | 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
|
137 | CxArrayReallocator *reallocator); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
138 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
139 | #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
|
140 | #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
|
141 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
142 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
143 | 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
|
144 | 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
|
145 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
146 | 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
|
147 | 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
|
148 | 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
|
149 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
150 | 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
|
151 | Otherwise, the function returns zero. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
152 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
153 | 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
|
154 | 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
|
155 | 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
|
156 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
157 | 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
|
158 | 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
|
159 | 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
|
160 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
161 | 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
|
162 | (including the width of the size and capacity). |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
163 | 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
|
164 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
165 | > 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
|
166 | > 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
|
167 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
168 | ## Copy |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
169 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
170 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
171 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
172 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
173 | int cx_array_copy( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
174 | 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
|
175 | size_t index, const void *src, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
176 | 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
|
177 | CxArrayReallocator *reallocator); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
178 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
179 | #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
|
180 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
181 | #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
|
182 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
183 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
184 | 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
|
185 | to the target array at the specified `index`, and then copies the data with one call to `memmove()`. |
1141 | 186 | |
187 | A few things to note: | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
188 | * `*target` and `src` can point to the same memory region, since the underlying copy operation is a `memmove()` |
1141 | 189 | * `*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
|
190 | 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
|
191 | * `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
|
192 | * 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
|
193 | * 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
|
194 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
195 | > 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
|
196 | > 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
|
197 | > 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
|
198 | > 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
|
199 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
200 | ## Add Elements |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
201 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
202 | ```C |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
203 | #include <cx/array_list.h> |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
204 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
205 | #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
|
206 | reallocator); |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
207 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
208 | #define cx_array_simple_add(ARRAY, elem) |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
209 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
210 | #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
|
211 | ``` |
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 | 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
|
214 | interpreting the `elem` as an array of size one, copied to the past-by-one index of the target array. |
1141 | 215 | |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
216 | ## Insertion Sort |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
217 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
218 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
219 | int cx_array_insert_sorted( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
220 | 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
|
221 | cx_compare_func cmp_func, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
222 | 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
|
223 | CxArrayReallocator *reallocator); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
224 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
225 | #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
|
226 | src, elem_count, cmp_func) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
227 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
228 | #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
|
229 | src, elem_count, cmp_func) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
230 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
231 | #define cx_array_add_sorted(target, size, capacity, |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
232 | 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
|
233 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
234 | #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
|
235 | elem, cmp_func) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
236 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
237 | #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
|
238 | elem, cmp_func) |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
239 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
240 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
241 | 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
|
242 | 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
|
243 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
244 | 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
|
245 | 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
|
246 | 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
|
247 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
248 | 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
|
249 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
250 | 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
|
251 | 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
|
252 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
253 | ## Binary Search |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
254 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
255 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
256 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
257 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
258 | size_t cx_array_binary_search( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
259 | 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
|
260 | 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
|
261 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
262 | 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
|
263 | 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
|
264 | 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
|
265 | |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
266 | 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
|
267 | 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
|
268 | 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
|
269 | ``` |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
270 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
271 | 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
|
272 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
273 | 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
|
274 | Otherwise, the function returns `size`. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
275 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
276 | 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
|
277 | 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
|
278 | 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
|
279 | 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
|
280 | than the searched element. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
281 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
282 | > 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
|
283 | > |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
284 | > 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
|
285 | >{style="note"} |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
286 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
287 | > 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
|
288 | > But observations show that it usually is. |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
289 | > 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
|
290 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
291 | ## Iterators |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
292 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
293 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
294 | #include <cx/iterator.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
295 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
296 | CxIterator cxIterator(const void *array, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
297 | 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
|
298 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
299 | CxIterator cxMutIterator(void *array, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
300 | 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
|
301 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
302 | 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
|
303 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
304 | 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
|
305 | bool remove_keeps_order); |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
306 | ``` |
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 | 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
|
309 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
310 | ## Other |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
311 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
312 | ```C |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
313 | #include <cx/array_list.h> |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
314 | |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
315 | void cx_array_swap( |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
316 | void *arr, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
317 | size_t elem_size, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
318 | size_t idx1, |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
319 | size_t idx2 |
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
320 | ); |
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 | |
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
323 | 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
|
324 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
325 | 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
|
326 | |
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
327 | 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
|
328 | |
1190
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
329 | <seealso> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
330 | <category ref="apidoc"> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
331 | <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
|
332 | </category> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
333 | </seealso> |