docs/Writerside/topics/list.h.md

Mon, 10 Mar 2025 11:54:46 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 10 Mar 2025 11:54:46 +0100
changeset 1240
c5924c781372
parent 1239
b4b1f15d1866
permissions
-rw-r--r--

complete list.h documentation

relates to #451

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1142
diff changeset
1 # List Interface
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
3 The `list.h` header defines a common interface for all list implementations.
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
4
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
5 UCX already comes with two common list implementations ([linked list](linked_list.h.md) and [array list](array_list.h.md))
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
6 that should cover most use cases.
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
7 But if you feel the need to implement an own list, you will find instructions [below](#implement-own-list-structures).
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
8
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
9 ```C
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
10 #include <cx/linked_list.h>
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
11
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
12 CxList *cxLinkedListCreate(const CxAllocator *allocator,
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
13 cx_compare_func comparator, size_t elem_size);
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
14
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
15 CxList *cxLinkedListCreateSimple(size_t elem_size);
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
16
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
17 #include <cx/array_list.h>
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
18
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
19 CxList *cxArrayListCreate(const CxAllocator *allocator,
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
20 cx_compare_func comparator, size_t elem_size,
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
21 size_t initial_capacity);
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
22
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
23 CxList *cxArrayListCreateSimple(size_t elem_size,
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
24 size_t initial_capacity);
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
25 ```
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
26
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
27 The function `cxLinkedListCreate()` creates a new linked list with the specified `allocator` which stores elements of size `elem_size`.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
28 The elements are supposed to be compared with the specified `comparator` (cf. [](#access-and-find)).
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
29 The function `cxLinkedListCreateSimple()` will use the stdlib default allocator and does not specify a compare function.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
30
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
31 Array lists can be created with `cxArrayListCreate()` where the additional argument `initial_capacity` specifies for how many elements the underlying array shall be initially allocated.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
32
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
33 If `CX_STORE_POINTERS` is used as `elem_size`, the actual element size will be `sizeof(void*)` and the list will behave slightly differently when accessing elements.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
34 Lists that are storing pointers will always return the stored pointer directly, instead of returning a pointer into the list's memory, thus saving you from unnecessary dereferencing.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
35 Conversely, when adding elements to the list, the pointers you specify (e.g. in `cxListAdd()` or `cxListInsert()`) are directly added to the list, instead of copying the contents pointed to by the argument.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
36
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
37 > When you create a list which is storing pointers and do not specify a compare function, `cx_cmp_ptr` will be used by default.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
38
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
39 ## Example
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
40
1240
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
41 In the following example we create a linked-list of regular expressions for filtering data.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
42
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
43 ```C
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
44 #include <cx/linked_list.h>
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
45 #include <regex.h>
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
46
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
47 CxList *create_pattern_list(void) {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
48 // create a linked list to store patterns
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
49 CxList *list = cxLinkedListCreateSimple(sizeof(regex_t));
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
50
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
51 // automatically free the pattern when list gets destroyed
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
52 cxDefineDestructor(list, regfree);
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
53
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
54 return list;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
55 }
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
56
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
57 int add_pattern(CxList *list, const char *value) {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
58 // compile pattern and add it to the list, if successful
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
59 regex_t regex;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
60 if (regcomp(&regex, value, REG_EXTENDED|REG_NOSUB)) {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
61 return 1;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
62 } else {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
63 // take address of local variable
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
64 // since we are not storing pointers in this list,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
65 // we get a copy of the data directly in the list
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
66 cxListAdd(list, &regex);
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
67 return 0;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
68 }
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
69 }
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
70
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
71 bool matches_any(CxList *list, const char *text) {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
72 CxIterator iter = cxListIterator(list);
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
73 cx_foreach(regex_t*, pat, iter) {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
74 if (regexec(pat, text, 0, NULL, 0) == 0) {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
75 return true;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
76 }
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
77 }
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
78 return false;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
79 }
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
80 ```
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
81
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
82 If in the above example the list was created with `CX_STORE_POINTERS` instead of `sizeof(regex_t)`,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
83 the `add_pattern()` function would need to be changed as follows:
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
84
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
85 ```C
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
86 int add_pattern(CxList *list, const char *value) {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
87 // allocate memory here, because now we are storing pointers
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
88 regex_t *regex = malloc(sizeof(regex_t));
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
89 if (!regex || regcomp(regex, value, REG_EXTENDED|REG_NOSUB)) {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
90 return 1;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
91 } else {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
92 cxListAdd(list, regex);
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
93 return 0;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
94 }
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
95 }
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
96 ```
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
97
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
98 Also, just registering `regfree()` as destructor is not sufficient anymore, because the `regex_t` structure also needs to be freed.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
99 Therefore, we would need to wrap the calls to `regfree()` and `free()` into an own destructor, which we then register with the list.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
100 However, it should be clear by now that using `CX_STORE_POINTERS` is a bad choice for this use case to begin with.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
101
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
102 As a rule of thumb: if you allocate memory for an element that you immediately put into the list, consider storing the element directly.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
103 And if you are getting pointers to already allocated memory from somewhere else, and you just want to organize those elements in a list, then consider using `CX_STORE_POINTERS`.
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
104
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
105 > If you want to lazy-initialize lists, you can use the global `cxEmptyList` symbol as a placeholder instead of using a `NULL`-pointer.
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
106 > While you *must not* insert elements into that list, you can safely access this list or create iterators.
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
107 > This allows you to write clean code without checking for `NULL`-pointer everywhere.
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
108 > You still need to make sure that the placeholder is replaced with an actual list before inserting elements.
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
109
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
110 ## Insert
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
111
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
112 ```C
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
113 #include <cx/list.h>
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
114
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
115 int cxListAdd(CxList *list, const void *elem);
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
116
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
117 int cxListInsert(CxList *list, size_t index, const void *elem);
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
118
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
119 int cxListInsertSorted(CxList *list, const void *elem);
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
120
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
121 size_t cxListAddArray(CxList *list, const void *array, size_t n);
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
122
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
123 size_t cxListInsertArray(CxList *list, size_t index,
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
124 const void *array, size_t n);
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
125
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
126 size_t cxListInsertSortedArray(CxList *list,
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
127 const void *array, size_t n);
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
128
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
129 int cxListInsertAfter(CxIterator *iter, const void *elem);
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
130
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
131 int cxListInsertBefore(CxIterator *iter, const void *elem);
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
132 ```
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
133
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
134 The function `cxListAdd()` appends the element `elem` to the list and returns zero on success or non-zero when allocating the memory for the element fails.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
135 Similarly, `cxListInsert()` adds the element at the specified `index`,
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
136 and `cxListInsertSorted()` adds the element at the correct position so that the list remains sorted according to the list's compare function.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
137
1240
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
138 When you are currently iterating through a list, you can insert elements before or after the current position of the iterator
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
139 with `cxListInsertBefore()` or `cxListInsertAfter()`, respectively.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
140 This _should_ be done with [mutating iterators](iterator.h.md#mutating-iterators) only, but is also defined for normal iterators.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
141
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
142 If the list is storing pointers (cf. `cxCollectionStoresPointers()`), the pointer `elem` is directly added to the list.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
143 Otherwise, the contents at the location pointed to by `elem` are copied to the list's memory with the element size specified during creation of the list.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
144
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
145 On the other hand the `array` argument for `cxListAddArray()`, `cxListInsertArray()`, and `cxListInsertSortedArray()`
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
146 must always point to an array of elements to be added (i.e. either an array of pointers, or an array of actual elements).
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
147
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
148 A special requirement for `cxListInsertSortedArray()` is, that the `array` must already be sorted.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
149
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
150 > Implementations are required to optimize the insertion of a sorted array into a sorted list in linear time,
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
151 > while inserting each element separately via `cxListInsertSorted()` may take quadratic time.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
152
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
153 > The functions `cxListInsertSorted()` and `cxListInsertSortedArray()` do neither check if the list is already sorted, nor do they actively sort the list.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
154 > {style="note"}
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
155
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
156 ## Access and Find
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
157
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
158 <link-summary>Functions for searching and accessing elements.</link-summary>
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
159
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
160 ```C
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
161 #include <cx/list.h>
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
162
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
163 void *cxListAt(const CxList *list, size_t index);
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
164
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
165 size_t cxListFind(const CxList *list, const void *elem);
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
166
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
167 size_t cxListFindRemove(CxList *list, const void *elem);
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
168
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
169 bool cxListIndexValid(const CxList *list, size_t index);
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
170
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
171 size_t cxListSize(const CxList *list);
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
172 ```
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
173
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
174 The function `cxListAt()` accesses the element at the specified `index`.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
175 If the list is storing pointers (i.e. `cxCollectionStoresPointers()` returns `true`), the pointer at the specified index is directly returned.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
176 Otherwise, a pointer to element at the specified index is returned.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
177 If the index is out-of-bounds, the function returns `NULL`.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
178
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
179 On the other hand, `cxListFind()` searches for the element pointed to by `elem` by comparing each element in the list with the list`s compare function,
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
180 and returns the first index when the element was found.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
181 Otherwise, the function returns the list size.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
182
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
183 The function `cxListFindRemove()` behaves like `cxListFind()`, except that it also removes the first occurrence of the element from the list.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
184 This will _also_ call destructor functions, if specified, so take special care when you continue to use `elem`, or when the list is storing pointers and the element appears more than once in the list.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
185
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
186 With `cxListIndexValid()` you can check the index returned by `cxListFind()` or `cxListFindRemove()`,
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
187 which is more convenient than comparing the return value if the return value of `cxListSize()`.
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
188
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
189 ## Remove
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
190
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
191 ```C
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
192 #include <cx/list.h>
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
193
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
194 int cxListRemove(CxList *list, size_t index);
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
195
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
196 size_t cxListRemoveArray(CxList *list, size_t index, size_t num);
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
197
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
198 int cxListRemoveAndGet(CxList *list, size_t index, void *targetbuf);
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
199
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
200 size_t cxListRemoveArrayAndGet(CxList *list, size_t index, size_t num,
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
201 void *targetbuf);
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
202
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
203 size_t cxListFindRemove(CxList *list, const void *elem);
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
204
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
205 void cxListClear(CxList *list);
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
206 ```
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
207
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
208 The function `cxListRemove()` removes the element at the specified index and returns zero,
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
209 or returns non-zero if the index is out-of-bounds.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
210 The function `cxListRemoveArray()` removes `num` elements starting at `index` and returns the number of elements that have been removed.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
211 For each removed element, the [destructor functions](collection.h.md#destructor-functions) are called.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
212
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
213 On the other hand, `cxListRemoveAndGet()` and `cxListRemoveArrayAndGet()` do not invoke the destructor functions
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
214 and instead copy the elements into the `targetbuf`, which must be large enough to hold the removed elements.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
215
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
216 The function `cxListFindRemove()` finds the first element within the list that is equivalent to the element pointed to by `elem` and removes it from the list.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
217 This will _also_ call destructor functions, if specified, so take special care when you continue to use `elem`.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
218
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
219 The function `cxListClear()` simply removes all elements from the list, invoking the destructor functions.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
220 It behaves equivalently, but is usually more efficient than calling `cxListRemove()` for every index.
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
221
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
222 ## Iterators
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
223
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
224 ```C
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
225 #include <cx/list.h>
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
226
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
227 CxIterator cxListIterator(const CxList *list);
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
228
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
229 CxIterator cxListBackwardsIterator(const CxList *list);
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
230
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
231 CxIterator cxListIteratorAt(const CxList *list, size_t index);
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
232
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
233 CxIterator cxListBackwardsIteratorAt(const CxList *list, size_t index);
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
234
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
235 CxIterator cxListMutIterator(CxList *list);
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
236
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
237 CxIterator cxListMutBackwardsIterator(CxList *list);
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
238
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
239 CxIterator cxListMutIteratorAt(CxList *list, size_t index);
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
240
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
241 CxIterator cxListMutBackwardsIteratorAt(CxList *list, size_t index);
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
242 ```
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
243
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
244 The functions `cxListIterator()` and `cxListBackwardsIterator()` create iterators
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
245 that start and the first or the last element in the list and iterate through the entire list.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
246
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
247 The functions `cxListIteratorAt()` and `cxListBackwardsIteratorAt()` start with the element at the specified index
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
248 and iterate until the end, or the beginning of the list, respectively.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
249
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
250 The functions with `Mut` in are equivalently, except that they create a [mutating iterator](iterator.h.md#mutating-iterators).
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
251 Removing elements via a mutating iterator will cause an invocation of the [destructor functions](collection.h.md#destructor-functions) for the removed element.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
252
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
253 If is safe to specify an out-of-bounds index in which case an iterator is returned for which `cxIteratorValid()` returns `false`, immediately.
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
254
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
255 ## Reorder
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
256
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
257 ```C
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
258 #include <cx/list.h>
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
259
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
260 int cxListSwap(CxList *list, size_t i, size_t j);
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
261
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
262 void cxListReverse(CxList *list);
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
263
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
264 void cxListSort(CxList *list);
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
265 ```
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
266
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
267 The function `cxListSwap()` swaps two elements specified by the indices `i` and `j`.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
268 The return value is non-zero if one of the indices is out-of-bounds.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
269
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
270 The function `cxListReverse()` reorders all elements, so that they appear in exactly the opposite order after invoking this function.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
271
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
272 The function `cxListSort()` sorts all elements with respect to the list's compare function,
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
273 unless the list is already sorted (cf. `cxCollectionSorted()`), in which case the function immediately returns.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
274
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
275 Default UCX implementations of the list interface make use of [small buffer optimizations](install.md#small-buffer-optimizations) when swapping elements.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
276
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
277 > An invocation of `cxListSort` sets the `sorted` flag of the [collection](collection.h.md).
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
278 > Implementations usually make use of this flag to optimize search operations, if possible.
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
279 > For example the [array list](array_list.h.md) implementation will use binary search
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
280 > for `cxListFind()` and similar operations, when the list is sorted.
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
281
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
282 ## Compare
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
283
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
284 ```C
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
285 #include <cx/list.h>
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
286
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
287 int cxListCompare(const CxList *list, const CxList *other);
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
288 ```
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
289
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
290 Arbitrary lists can be compared element-wise with `cxListCompare()`, as long as the compare functions of both lists are equivalent.
1238
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
291
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
292 That means, you can compare an UCX [array list](array_list.h.md) with a [linked list](linked_list.h.md),
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
293 and you could even compare lists that are storing pointers with lists that are not storing pointers.
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
294
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
295 However, the optimized list-internal compare implementation is only used, when both the compare functions and the list classes are identical.
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
296 Otherwise, `cxListCompare()` will behave as if you were iterating through both lists and manually comparing the elements.
1238
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
297
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
298 The return value of `cxListCompare()` is zero, if the lists are element-wise equivalent.
1238
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
299 If they are not, the non-zero return value equals the return value of the used compare function for the first pair of elements that are not equal.
1236
f392f27a1dc6 list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
300
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
301 ## Dispose
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
302
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
303 ```C
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
304 #include <cx/list.h>
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
305
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
306 void cxListFree(CxList *list);
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
307 ```
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
308
1238
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
309 No matter with which function a `CxList` has been created, you can _always_ deallocate the entire memory with a call to `cxListFree()`.
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
310
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
311 The effect is equivalent to invoking `cxListClear()` plus deallocating the memory for the list structure.
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1238
diff changeset
312 That means, for each element in the list, the [destructor functions](collection.h.md#destructor-functions) are called before deallocating the list.
1238
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
313
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
314 When the list has been storing pointers, make sure that either another reference to the same memory exist in your program,
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
315 or any of the destructor functions deallocates the memory.
26299ce9c955 documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents: 1237
diff changeset
316 Otherwise, there is a risk of a memory leak.
1237
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
317
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
318 ## Implement own List Structures
5cba456aff67 add structure to list documentation
Mike Becker <universe@uap-core.de>
parents: 1236
diff changeset
319
1240
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
320 If you want to create your own list implementation, this is extremely easy.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
321
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
322 You just need to define a function for creating your list and assign a `cx_list_class` structure with the pointers to your implementation.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
323 Then you call the `cx_list_init()` helper function to initialize the collection sture.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
324 This also automatically adds support for `CX_STORE_POINTERS` to your list.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
325
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
326 ```C
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
327 // define the class with pointers to your functions
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
328 static cx_list_class my_list_class = {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
329 my_list_destructor,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
330 my_list_insert_element,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
331 my_list_insert_array,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
332 my_list_insert_sorted,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
333 my_list_insert_iter,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
334 my_list_remove,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
335 my_list_clear,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
336 my_list_swap,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
337 my_list_at,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
338 my_list_find_remove,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
339 my_list_sort,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
340 my_list_compare,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
341 my_list_reverse,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
342 my_list_iterator,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
343 };
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
344
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
345 typedef struct {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
346 struct cx_list_s base;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
347 // your custom list data goes here
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
348 } my_list;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
349
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
350 CxList *my_list_create(
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
351 const CxAllocator *allocator,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
352 cx_compare_func cmpfun,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
353 size_t elem_size
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
354 ) {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
355 if (allocator == NULL) {
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
356 allocator = cxDefaultAllocator;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
357 }
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
358
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
359 my_list *list = cxCalloc(allocator, 1, sizeof(my_list));
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
360 if (list == NULL) return NULL;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
361 cx_list_init((CxList*)list, &my_list_class,
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
362 allocator, cmpfun, elem_size);
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
363
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
364 // initialize your custom list data here
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
365
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
366 return (CxList *) list;
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
367 }
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
368 ```
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
369
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
370 The required behavior for the implementations is described in the following table.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
371 You can always look at the source code of the UCX implementations to get inspiration.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
372
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
373 | Function | Description |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
374 |------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
375 | `clear` | Invoke destructor functions on all elements and remove them from the list. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
376 | `destructor` | Invoke destructor functions on all elements and deallocate the entire list memory. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
377 | `insert_element` | Insert a single element at the specified index. Return zero on success and non-zero on failure. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
378 | `insert_array` | Insert an array of elements starting at the specified index. Return the number of elements inserted. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
379 | `insert_sorted` | Insert an array of sorted elements into a sorted list. Return the number of elements inserted. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
380 | `insert_iter` | Insert a single element depending on the iterator position. The third argument to this function is zero when the element shall be inserted after the iterator position and non-zero if it shall be inserted before the iterator position. The implementation is also responsible for adjusting the iterator, respectively. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
381 | `remove` | Removes a multiple elements starting at the specified index. If a target buffer is specified, copy the elements to that buffer. Otherwise, invoke the destructor functions for the elements. Return the number of elements actually removed. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
382 | `swap` | Swap two elements by index. Return zero on success or non-zero when any index was out-of-bounds. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
383 | `at` | Return a pointer to the element at the specified index or `NULL` when the index is out-of-bounds. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
384 | `find_remove` | Search for the specified element with the list's compare function and return the index if found. If the `remove` argument is true, invoke the destructor functions and remove the element. Return the list size if the element is not found. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
385 | `sort` | Sort all elements in the list with respect to the list's compare function. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
386 | `compare` | Only function pointer that may be `NULL`, in which case an unoptimized fallback is used. You can implement an optimized compare function that compares the list of another list of the same class. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
387 | `reverse` | Reorders all elements in the list so that they appear in exactly the opposite order. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
388 | `iterator` | Creates an iterator starting at the specified index. The Boolean argument indicates whether iteration is supposed to traverse backwards. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
389
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
390 > If you initialize your list with `cx_list_init()` you do not have to worry about making a
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
391 > difference between storing pointers and storing elements, because your implementation will
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
392 > be automatically wrapped.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
393 > This means, you only have to handle the one single case described above.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
394
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
395 ### Default Class Function Implementations
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
396
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
397 If you are satisfied with some of the default implementations, you can use some pre-defined functions.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
398 Note, however, that those are not optimized for any specific list structure
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
399 and just serve as a quick and convenient solution if performance does not matter for your use case.
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
400
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
401
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
402 | Default Function | Description |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
403 |---------------------------------|-----------------------------------------------------------------------------------|
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
404 | `cx_list_default_insert_array` | Falls back to multiple calls of `insert_element`. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
405 | `cx_list_default_insert_sorted` | Uses linear search to find insertion points. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
406 | `cx_list_default_sort` | Copies all elements to an array, applies `qsort()`, and copies the elements back. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
407 | `cx_list_default_swap` | Uses a temporarily allocated buffer to perform a three-way-swap. |
c5924c781372 complete list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
408
1142
9437530176bc add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents: 1141
diff changeset
409
1190
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
410 <seealso>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
411 <category ref="apidoc">
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
412 <a href="https://ucx.sourceforge.io/api/list_8h.html">list.h</a>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
413 </category>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
414 </seealso>

mercurial