Fri, 23 May 2025 12:44:24 +0200
make test-compile depend on both static and shared
the shared lib is not needed for the tests,
but when run with coverage, gcov will be confused
when outdated line information is available from
a previous shared build
1143
0559812df10c
assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents:
1142
diff
changeset
|
1 | # List Interface |
1141 | 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)). |
1318
12fa1d37fe48
allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents:
1316
diff
changeset
|
29 | The function `cxLinkedListCreateSimple()` will use the [default allocator](allocator.h.md#default-allocator) and does not specify a compare function. |
1239
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 | |
1243
13e15cd529ae
structur for map.h documentation
Mike Becker <universe@uap-core.de>
parents:
1240
diff
changeset
|
39 | > If you want to lazy-initialize lists, you can use the global `cxEmptyList` symbol as a placeholder instead of using a `NULL`-pointer. |
13e15cd529ae
structur for map.h documentation
Mike Becker <universe@uap-core.de>
parents:
1240
diff
changeset
|
40 | > While you *must not* insert elements into that list, you can safely access this list or create iterators. |
13e15cd529ae
structur for map.h documentation
Mike Becker <universe@uap-core.de>
parents:
1240
diff
changeset
|
41 | > This allows you to write clean code without checking for `NULL`-pointer everywhere. |
13e15cd529ae
structur for map.h documentation
Mike Becker <universe@uap-core.de>
parents:
1240
diff
changeset
|
42 | > You still need to make sure that the placeholder is replaced with an actual list before inserting elements. |
13e15cd529ae
structur for map.h documentation
Mike Becker <universe@uap-core.de>
parents:
1240
diff
changeset
|
43 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
44 | ## Example |
1236
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
45 | |
1240
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
46 | 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
|
47 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
48 | ```C |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
49 | #include <cx/linked_list.h> |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
50 | #include <regex.h> |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
51 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
52 | CxList *create_pattern_list(void) { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
53 | // create a linked list to store patterns |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
54 | CxList *list = cxLinkedListCreateSimple(sizeof(regex_t)); |
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 | // automatically free the pattern when list gets destroyed |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
57 | cxDefineDestructor(list, regfree); |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
58 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
59 | return list; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
60 | } |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
61 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
62 | int add_pattern(CxList *list, const char *value) { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
63 | // 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
|
64 | regex_t regex; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
65 | if (regcomp(®ex, value, REG_EXTENDED|REG_NOSUB)) { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
66 | return 1; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
67 | } else { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
68 | // take address of local variable |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
69 | // since we are not storing pointers in this list, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
70 | // 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
|
71 | cxListAdd(list, ®ex); |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
72 | return 0; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
73 | } |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
74 | } |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
75 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
76 | bool matches_any(CxList *list, const char *text) { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
77 | CxIterator iter = cxListIterator(list); |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
78 | cx_foreach(regex_t*, pat, iter) { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
79 | if (regexec(pat, text, 0, NULL, 0) == 0) { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
80 | return true; |
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 | } |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
83 | return false; |
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 | ``` |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
86 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
87 | 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
|
88 | 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
|
89 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
90 | ```C |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
91 | int add_pattern(CxList *list, const char *value) { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
92 | // allocate memory here, because now we are storing pointers |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
93 | regex_t *regex = malloc(sizeof(regex_t)); |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
94 | if (!regex || regcomp(regex, value, REG_EXTENDED|REG_NOSUB)) { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
95 | return 1; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
96 | } else { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
97 | cxListAdd(list, regex); |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
98 | return 0; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
99 | } |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
100 | } |
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 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
103 | 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
|
104 | 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
|
105 | 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
|
106 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
107 | As a rule of thumb: if you allocate memory for an element that you immediately put into the list, consider storing the element directly. |
1243
13e15cd529ae
structur for map.h documentation
Mike Becker <universe@uap-core.de>
parents:
1240
diff
changeset
|
108 | 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
|
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 | |
1316
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
119 | void *cxListEmplace(CxList *list); |
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
120 | |
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
121 | void *cxListEmplaceAt(CxList *list, size_t index); |
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
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 | int cxListInsertSorted(CxList *list, const void *elem); |
1141 | 124 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
125 | 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
|
126 | |
1236
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
127 | 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
|
128 | 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
|
129 | |
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
130 | 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
|
131 | 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
|
132 | |
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
133 | 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
|
134 | |
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
135 | int cxListInsertBefore(CxIterator *iter, const void *elem); |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
136 | ``` |
1236
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
137 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
138 | 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. |
1316
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
139 | Similarly, `cxListInsert()` adds the element at the specified `index`. |
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
140 | |
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
141 | The functions `cxListEmplace()` and `cxListEmplaceAt()` behave like `cxListAdd()` and `cxListInsert()`, |
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
142 | except that they only allocate the memory and return a pointer to it, leaving it to the callee to copy the element data into it. |
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
143 | Be aware that when the list is storing pointers, the allocated memory will be for the pointer, not the actual element's data. |
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
144 | |
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
145 | The function `cxListInsertSorted()` inserts the element at the correct position so that the list remains sorted according to the list's compare function. |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
146 | |
1240
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
147 | 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
|
148 | 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
|
149 | 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
|
150 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
151 | 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
|
152 | 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
|
153 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
154 | 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
|
155 | 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
|
156 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
157 | 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
|
158 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
159 | > 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
|
160 | > 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
|
161 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
162 | > 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
|
163 | > {style="note"} |
1237
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 | ## Access and Find |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
166 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
167 | <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
|
168 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
169 | ```C |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
170 | #include <cx/list.h> |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
171 | |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
172 | void *cxListAt(const CxList *list, size_t index); |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
173 | |
1315
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
174 | void *cxListFirst(const CxList *list); |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
175 | |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
176 | void *cxListLast(const CxList *list); |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
177 | |
1287
3a3ffc27813f
adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents:
1244
diff
changeset
|
178 | int cxListSet(CxList *list, size_t index, const void *elem); |
3a3ffc27813f
adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents:
1244
diff
changeset
|
179 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
180 | 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
|
181 | |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
182 | size_t cxListFindRemove(CxList *list, const void *elem); |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
183 | |
1294
30d7ae76c76a
add test and documentation for cxListContains() - fixes #643
Mike Becker <universe@uap-core.de>
parents:
1287
diff
changeset
|
184 | bool cxListContains(const CxList *list, const void *elem); |
30d7ae76c76a
add test and documentation for cxListContains() - fixes #643
Mike Becker <universe@uap-core.de>
parents:
1287
diff
changeset
|
185 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
186 | 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
|
187 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
188 | size_t cxListSize(const CxList *list); |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
189 | ``` |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
190 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
191 | 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
|
192 | 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
|
193 | 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
|
194 | If the index is out-of-bounds, the function returns `NULL`. |
1315
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
195 | The functions `cxListFirst()` and `cxListLast()` behave like `cxListAt()`, |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
196 | accessing the first or the last valid index, respectively, and returning `NULL` when the list is empty. |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
197 | |
1287
3a3ffc27813f
adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents:
1244
diff
changeset
|
198 | The function `cxListSet()` allows you to modify elements at a specific index in the list. |
3a3ffc27813f
adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents:
1244
diff
changeset
|
199 | This function replaces the element at the specified `index` with the value pointed to by `elem`. |
3a3ffc27813f
adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents:
1244
diff
changeset
|
200 | If the list is storing values directly (not pointers), the contents at the memory location `elem` will be copied into the list. |
3a3ffc27813f
adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents:
1244
diff
changeset
|
201 | If the list is storing pointers, the pointer value itself will be stored. |
3a3ffc27813f
adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents:
1244
diff
changeset
|
202 | The function returns `0` on success and `1` if the index is out of bounds. |
3a3ffc27813f
adds cxListSet() - resolves #642
Mike Becker <universe@uap-core.de>
parents:
1244
diff
changeset
|
203 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
204 | 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
|
205 | 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
|
206 | 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
|
207 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
208 | 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
|
209 | 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
|
210 | |
1294
30d7ae76c76a
add test and documentation for cxListContains() - fixes #643
Mike Becker <universe@uap-core.de>
parents:
1287
diff
changeset
|
211 | The function `cxListContains()` returns `true`, if and only if `cxListFind()` would return a valid index. |
30d7ae76c76a
add test and documentation for cxListContains() - fixes #643
Mike Becker <universe@uap-core.de>
parents:
1287
diff
changeset
|
212 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
213 | 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
|
214 | 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
|
215 | |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
216 | ## Remove |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
217 | |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
218 | ```C |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
219 | #include <cx/list.h> |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
220 | |
1236
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
221 | 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
|
222 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
223 | 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
|
224 | |
1315
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
225 | size_t cxListFindRemove(CxList *list, const void *elem); |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
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 | 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
|
228 | |
1315
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
229 | int cxListRemoveAndGetFirst(CxList *list, void *targetbuf); |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
230 | |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
231 | int cxListPopFront(CxList *list, void *targetbuf); |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
232 | |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
233 | int cxListRemoveAndLast(CxList *list, void *targetbuf); |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
234 | |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
235 | int cxListPop(CxList *list, void *targetbuf); |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
236 | |
1236
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
237 | 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
|
238 | void *targetbuf); |
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
239 | |
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
240 | void cxListClear(CxList *list); |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
241 | ``` |
1236
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
242 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
243 | 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
|
244 | 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
|
245 | 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
|
246 | 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
|
247 | |
1315
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
248 | 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. |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
249 | This will _also_ call destructor functions, if specified, so take special care when you continue to use `elem`. |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
250 | |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
251 | On the other hand, `cxListRemoveAndGet()` family of functions do not invoke the destructor functions |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
252 | 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
|
253 | |
1315
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
254 | > Note, that when the list was initialized with `CX_STORE_POINTERS`, |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
255 | > the elements that will be copied to the `targetbuf` are the _pointers_. |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
256 | > In contrast to other list functions, like `cxListAt()`, an automatic dereferencing does not happen here. |
b4c3e0b4c3d5
add convenience functions for easy access to first/last element of a list
Mike Becker <universe@uap-core.de>
parents:
1294
diff
changeset
|
257 | >{style="note"} |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
258 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
259 | 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
|
260 | 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
|
261 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
262 | ## Iterators |
1236
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
263 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
264 | ```C |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
265 | #include <cx/list.h> |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
266 | |
1236
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
267 | 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
|
268 | |
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
269 | 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
|
270 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
271 | CxIterator cxListIteratorAt(const CxList *list, size_t index); |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
272 | |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
273 | CxIterator cxListBackwardsIteratorAt(const CxList *list, size_t index); |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
274 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
275 | CxIterator cxListMutIterator(CxList *list); |
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 | CxIterator cxListMutBackwardsIterator(CxList *list); |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
278 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
279 | CxIterator cxListMutIteratorAt(CxList *list, size_t index); |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
280 | |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
281 | CxIterator cxListMutBackwardsIteratorAt(CxList *list, size_t index); |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
282 | ``` |
1236
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
283 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
284 | 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
|
285 | 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
|
286 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
287 | 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
|
288 | 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
|
289 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
290 | 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
|
291 | 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
|
292 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
293 | 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
|
294 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
295 | ## Reorder |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
296 | |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
297 | ```C |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
298 | #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
|
299 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
300 | 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
|
301 | |
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
302 | 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
|
303 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
304 | void cxListSort(CxList *list); |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
305 | ``` |
1236
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
306 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
307 | 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
|
308 | 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
|
309 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
310 | 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
|
311 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
312 | 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
|
313 | 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
|
314 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
315 | 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
|
316 | |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
317 | > 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
|
318 | > 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
|
319 | > 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
|
320 | > 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
|
321 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
322 | ## Compare |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
323 | |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
324 | ```C |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
325 | #include <cx/list.h> |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
326 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
327 | 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
|
328 | ``` |
f392f27a1dc6
list all function from list.h that need to be documented
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
329 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
330 | 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
|
331 | |
26299ce9c955
documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents:
1237
diff
changeset
|
332 | 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
|
333 | 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
|
334 | |
26299ce9c955
documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents:
1237
diff
changeset
|
335 | 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
|
336 | 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
|
337 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
338 | 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
|
339 | 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
|
340 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
341 | ## Dispose |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
342 | |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
343 | ```C |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
344 | #include <cx/list.h> |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1238
diff
changeset
|
345 | |
1237
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
346 | void cxListFree(CxList *list); |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
347 | ``` |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
348 | |
1238
26299ce9c955
documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents:
1237
diff
changeset
|
349 | 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
|
350 | |
26299ce9c955
documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents:
1237
diff
changeset
|
351 | 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
|
352 | 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
|
353 | |
26299ce9c955
documentation for list compare and dispose
Mike Becker <universe@uap-core.de>
parents:
1237
diff
changeset
|
354 | 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
|
355 | 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
|
356 | 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
|
357 | |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
358 | ## Implement own List Structures |
5cba456aff67
add structure to list documentation
Mike Becker <universe@uap-core.de>
parents:
1236
diff
changeset
|
359 | |
1240
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
360 | 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
|
361 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
362 | 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
|
363 | 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
|
364 | 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
|
365 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
366 | ```C |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
367 | // define the class with pointers to your functions |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
368 | static cx_list_class my_list_class = { |
1244
9a8e781258ac
complete most of the map.h documentation
Mike Becker <universe@uap-core.de>
parents:
1243
diff
changeset
|
369 | my_list_deallocate, |
1240
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
370 | my_list_insert_element, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
371 | my_list_insert_array, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
372 | my_list_insert_sorted, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
373 | my_list_insert_iter, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
374 | my_list_remove, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
375 | my_list_clear, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
376 | my_list_swap, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
377 | my_list_at, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
378 | my_list_find_remove, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
379 | my_list_sort, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
380 | my_list_compare, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
381 | my_list_reverse, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
382 | my_list_iterator, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
383 | }; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
384 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
385 | typedef struct { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
386 | struct cx_list_s base; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
387 | // your custom list data goes here |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
388 | } my_list; |
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 | CxList *my_list_create( |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
391 | const CxAllocator *allocator, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
392 | cx_compare_func cmpfun, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
393 | size_t elem_size |
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 | if (allocator == NULL) { |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
396 | allocator = cxDefaultAllocator; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
397 | } |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
398 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
399 | my_list *list = cxCalloc(allocator, 1, sizeof(my_list)); |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
400 | if (list == NULL) return NULL; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
401 | cx_list_init((CxList*)list, &my_list_class, |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
402 | allocator, cmpfun, elem_size); |
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 | // initialize your custom list data here |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
405 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
406 | return (CxList *) list; |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
407 | } |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
408 | ``` |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
409 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
410 | 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
|
411 | 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
|
412 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
413 | | Function | Description | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
414 | |------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
415 | | `clear` | Invoke destructor functions on all elements and remove them from the list. | |
1244
9a8e781258ac
complete most of the map.h documentation
Mike Becker <universe@uap-core.de>
parents:
1243
diff
changeset
|
416 | | `deallocate` | Invoke destructor functions on all elements and deallocate the entire list memory. | |
1316
c41538edfcef
add cxListEmplace() and cxListEmplaceAt() plus some improvements to the array list implementation
Mike Becker <universe@uap-core.de>
parents:
1315
diff
changeset
|
417 | | `insert_element` | Insert a single element at the specified index. Return a pointer to the data of the inserted element or `NULL` on failure. | |
1240
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
418 | | `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
|
419 | | `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
|
420 | | `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
|
421 | | `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
|
422 | | `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
|
423 | | `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
|
424 | | `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
|
425 | | `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
|
426 | | `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
|
427 | | `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
|
428 | | `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
|
429 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
430 | > 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
|
431 | > 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
|
432 | > be automatically wrapped. |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
433 | > 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
|
434 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
435 | ### Default Class Function Implementations |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
436 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
437 | 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
|
438 | 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
|
439 | 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
|
440 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
441 | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
442 | | Default Function | Description | |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
443 | |---------------------------------|-----------------------------------------------------------------------------------| |
c5924c781372
complete list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1239
diff
changeset
|
444 | | `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
|
445 | | `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
|
446 | | `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
|
447 | | `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
|
448 | |
1142
9437530176bc
add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents:
1141
diff
changeset
|
449 | |
1190
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
450 | <seealso> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
451 | <category ref="apidoc"> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
452 | <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
|
453 | </category> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
454 | </seealso> |