docs/Writerside/topics/array_list.h.md

Wed, 15 Oct 2025 22:45:21 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 15 Oct 2025 22:45:21 +0200
changeset 1425
83284b289430
parent 1424
563033aa998c
permissions
-rw-r--r--

remove unnecessary members from the array reallocator struct - fixes #621

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1142
diff changeset
1 # Array List
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
1390
ff077f793c5d kv-list: add documentation
Mike Becker <universe@uap-core.de>
parents: 1322
diff changeset
6 The high-level [list interface](list.h.md) is documented on a separate page and explains how lists are used
1245
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
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
82 > The aforementioned macros simplify your life, but keep in mind that using them is not mandatory.
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
83 > All other macros continue to work perfectly if you declare and initialize your array manually, as long as you use
1246
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`.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
85 > Also, you can freely decide in which order you want to declare the variables.
1246
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);
1425
83284b289430 remove unnecessary members from the array reallocator struct - fixes #621
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
99 const CxAllocator *allocator;
83284b289430 remove unnecessary members from the array reallocator struct - fixes #621
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
100 const void *stack_ptr;
1245
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
101 } CxArrayReallocator;
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
102
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
103 CxArrayReallocator cx_array_reallocator(
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
104 const struct cx_allocator_s *allocator,
1425
83284b289430 remove unnecessary members from the array reallocator struct - fixes #621
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
105 const void *stack_ptr
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106 );
1248
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
107
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
108 extern CxArrayReallocator* cx_array_default_reallocator;
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109 ```
1245
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
110
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
111 The main purpose of the functions defined in the array list header
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
112 is to make it easier to write to an array without caring too much about a possibly necessary reallocation.
1245
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
113
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
114 This is realized by passing a reallocator to the various functions that specify 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
115
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1248
diff changeset
116 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
117
1248
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
118 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
119 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
120 and on the other hand, it can optionally keep track of a stack memory pointer.
1425
83284b289430 remove unnecessary members from the array reallocator struct - fixes #621
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
121 If you pass a non-`NULL` pointer to `stack_ptr`, the reallocator will _always_ allocate _new_ memory for the array,
83284b289430 remove unnecessary members from the array reallocator struct - fixes #621
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
122 if the current location equals the `stack_ptr` address.
1245
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
123
1248
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
124 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.
1425
83284b289430 remove unnecessary members from the array reallocator struct - fixes #621
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
125 Combined with a UCX [memory pool](mempool.h.md) this can be a powerful tool.
83284b289430 remove unnecessary members from the array reallocator struct - fixes #621
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
126 For example, you can add small arrays to your structs plus a memory pool and then use that memory pool to reallocate the arrays on the heap when needed.
83284b289430 remove unnecessary members from the array reallocator struct - fixes #621
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
127 When you are done with the arrays, you can then use the memory pool to free the memory for those arrays that needed to be moved to the heap.
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
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
148 a new pointer back to that variable if the array needed to be reallocated.
1248
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
149
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
150 If reallocation fails, this function returns non-zero, leaving the array as it was.
1248
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.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
158 On 32-bit platforms the widths 1, 2, and 4 are supported, and on 64-bit platforms a width of 8 is also supported.
1248
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.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
186
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
196 > In other words: if you already guarantee, by any means that no reallocation is necessary when writing to your array,
1248
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
219 #include <cx/array_list.h>
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
220
1245
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
221 int cx_array_insert_sorted(
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
222 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
223 cx_compare_func cmp_func,
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
224 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
225 CxArrayReallocator *reallocator);
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
226
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
227 #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
228 src, elem_count, cmp_func)
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
229
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
230 #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
231 src, elem_count, cmp_func)
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
232
1248
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
233 #define cx_array_add_sorted(target, size, capacity,
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
234 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
235
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
236 #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
237 elem, cmp_func)
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
238
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
239 #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
240 elem, cmp_func)
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
241 ```
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
242
1248
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
243 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
244 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
245
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
246 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
247 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
248 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
249
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
250 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
251
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
252 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
253 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
254
1419
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
255 ## Sets of Unique Elements
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
256
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
257 ```C
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
258 #include <cx/array_list.h>
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
259
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
260 int cx_array_insert_unique(
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
261 void **target, size_t *size, size_t *capacity,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
262 cx_compare_func cmp_func,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
263 const void *src, size_t elem_size, size_t elem_count,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
264 CxArrayReallocator *reallocator);
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
265
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
266 #define cx_array_simple_insert_unique(ARRAY,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
267 src, elem_count, cmp_func)
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
268
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
269 #define cx_array_simple_insert_unique_a(reallocator, ARRAY,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
270 src, elem_count, cmp_func)
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
271
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
272 #define cx_array_add_unique(target, size, capacity,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
273 elem_size, elem, cx_compare_func cmp_func, reallocator);
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
274
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
275 #define cx_array_simple_add_unique(ARRAY,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
276 elem, cmp_func)
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
277
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
278 #define cx_array_simple_add_unique_a(reallocator, ARRAY,
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
279 elem, cmp_func)
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
280 ```
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
281
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
282 The above functions are similar to `cx_array_insert_sorted()` and its [relatives](#insertion-sort),
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
283 except that they skip insertion of elements that are already present in the target array.
e46406fd1b3c add functions to insert elements into lists/arrays without duplicates - resolves #557
Mike Becker <universe@uap-core.de>
parents: 1390
diff changeset
284
1245
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
285 ## Binary Search
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
286
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
287 ```C
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
288 #include <cx/array_list.h>
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
289
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
290 size_t cx_array_binary_search(
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
291 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
292 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
293
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
294 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
295 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
296 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
297
1245
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
298 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
299 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
300 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
301 ```
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
302
1248
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
303 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
304
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
305 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
306 Otherwise, the function returns `size`.
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
307
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
308 The functions `cx_array_binary_search_inf()` and `cx_array_binary_search_sup()` are equivalent,
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
309 except that they return the index of the closest element if the searched element is not found.
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
310 The former function returns the closest element that is less or equal (the greatest lower bound / infimum),
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1419
diff changeset
311 and the latter function returns the closest element that is larger or equal (the least upper bound / supremum)
1248
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
312 than the searched element.
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
313
1425
83284b289430 remove unnecessary members from the array reallocator struct - fixes #621
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
314 > Note that all the above functions are only well-defined on arrays which are sorted with respect to the given compare function.
1248
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
315 >
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
316 > 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
317 >{style="note"}
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
318
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
319 > 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
320 > But observations show that it usually is.
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
321 > 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
322
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
323 ## Iterators
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
324
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
325 ```C
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
326 #include <cx/iterator.h>
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
327
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
328 CxIterator cxIterator(const void *array,
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
329 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
330
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
331 CxIterator cxMutIterator(void *array,
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
332 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
333
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
334 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
335
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
336 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
337 bool remove_keeps_order);
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
338 ```
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
339
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
340 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
341
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
342 ## Other
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
343
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
344 ```C
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
345 #include <cx/array_list.h>
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
346
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
347 void cx_array_swap(
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
348 void *arr,
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
349 size_t elem_size,
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
350 size_t idx1,
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
351 size_t idx2
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
352 );
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
353 ```
721e2032fa25 define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
354
1248
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
355 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
356
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
357 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
358
fc5e63b04281 complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1246
diff changeset
359 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
360
1190
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
361 <seealso>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
362 <category ref="apidoc">
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
363 <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
364 </category>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
365 </seealso>

mercurial