Sun, 23 Nov 2025 13:15:19 +0100
optimize sorted insertion by using the infimum instead of the supremum
The reason is that the supremum returns the equal element with the smallest index, and we want the largest.
Therefore, we use the infimum, which already gives us the largest index when there are equal elements, and increase the index by one. The infimum is also guaranteed to exist in that case.
|
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 | |
|
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 | 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 | 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 | 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. |
|
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 | 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 | |
|
1507
f4010cda9a2a
stable return value for binary search when there are duplicates in the array
Mike Becker <universe@uap-core.de>
parents:
1429
diff
changeset
|
314 | When the found element appears more than once in the array, |
|
f4010cda9a2a
stable return value for binary search when there are duplicates in the array
Mike Becker <universe@uap-core.de>
parents:
1429
diff
changeset
|
315 | the binary search and the infimum report the largest index |
|
f4010cda9a2a
stable return value for binary search when there are duplicates in the array
Mike Becker <universe@uap-core.de>
parents:
1429
diff
changeset
|
316 | and the supremum reports the smallest index of the identical items, respectively. |
|
f4010cda9a2a
stable return value for binary search when there are duplicates in the array
Mike Becker <universe@uap-core.de>
parents:
1429
diff
changeset
|
317 | |
|
1425
83284b289430
remove unnecessary members from the array reallocator struct - fixes #621
Mike Becker <universe@uap-core.de>
parents:
1424
diff
changeset
|
318 | > 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
|
319 | > |
|
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
320 | > 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
|
321 | >{style="note"} |
|
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
322 | |
|
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
323 | > 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
|
324 | > But observations show that it usually is. |
|
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
325 | > 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
|
326 | |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
327 | ## Iterators |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
328 | |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
329 | ```C |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
330 | #include <cx/iterator.h> |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
331 | |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
332 | CxIterator cxIterator(const void *array, |
|
1429
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents:
1425
diff
changeset
|
333 | size_t elem_size, size_t elem_count, |
|
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents:
1425
diff
changeset
|
334 | bool remove_keeps_order); |
|
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents:
1425
diff
changeset
|
335 | |
|
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents:
1425
diff
changeset
|
336 | CxIterator cxIteratorPtr(const void *array, |
|
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents:
1425
diff
changeset
|
337 | size_t elem_count, |
|
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
338 | bool remove_keeps_order); |
|
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 | |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
341 | 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
|
342 | |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
343 | ## Other |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
344 | |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
345 | ```C |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
346 | #include <cx/array_list.h> |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
347 | |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
348 | void cx_array_swap( |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
349 | void *arr, |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
350 | size_t elem_size, |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
351 | size_t idx1, |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
352 | size_t idx2 |
|
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 | ``` |
|
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
355 | |
|
1248
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
356 | 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
|
357 | |
|
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
358 | 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
|
359 | |
|
fc5e63b04281
complete array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1246
diff
changeset
|
360 | 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
|
361 | |
|
1190
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
362 | <seealso> |
|
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
363 | <category ref="apidoc"> |
|
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
364 | <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
|
365 | </category> |
|
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
366 | </seealso> |