docs/Writerside/topics/collection.h.md

Wed, 17 Dec 2025 19:05:50 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 17 Dec 2025 19:05:50 +0100
changeset 1618
ef7cab6eb131
parent 1605
55b13f583356
permissions
-rw-r--r--

huge refactoring of collections to add support for 3-arg compare functions

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1141
diff changeset
1 # Collections
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
3 UCX defines common attributes for collections.
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 If you want to implement an own collection data type that uses the same features, you can use the
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 `CX_COLLECTION_BASE` macro at the beginning of your struct to roll out all members a usual UCX collection has.
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
6
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
7 This macro will embed a structure in your collection that can be accessed with the member name `collection`.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
8
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 ```c
1215
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1171
diff changeset
10 #include <cx/collection.h>
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1171
diff changeset
11
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 struct my_fancy_collection_s {
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
13 CX_COLLECTION_BASE; // adds a member named 'collection'
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 struct my_collection_data_s *data;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 };
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 ```
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
17
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
18 > You can always look at the UCX list and map implementations if you need some inspiration.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
19
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
20 ## Base Attributes of a Collection
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
21
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
22 The following attributes are declared by the `CX_COLLECTION_BASE` macro:
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
23
1618
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
24 | Attribute | Description |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
25 |-----------------------|-----------------------------------------------------------------------------------------------------------------------------------|
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
26 | `allocator` | The [allocator](allocator.h.md) that shall be used for the collection data. |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
27 | `elem_size` | The size of one element in bytes. |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
28 | `size` | The size, meaning the number of elements, currently stored. |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
29 | `simple_cmp` | A function to [compare](compare.h.md) two elements. |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
30 | `advanced_cmp` | A function that compares two elements and supports custom data. If specified, this has precedence over the `simple_cmp` function. |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
31 | `cmp_data` | A pointer to the custom data that shall be passed to the `advanced_cmp` function. |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
32 | `simple_destructor` | An optional simple [destructor function](allocator.h.md#destructor-functions). |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
33 | `advanced_destructor` | An optional advanced destructor function. |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
34 | `destructor_data` | A pointer to the custom data that shall be passed to the advanced destructor. |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
35 | `store_pointer` | A `bool` indicating whether this collection stores pointers instead of the element's data. |
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
36 | `sorted` | A `bool` indicating whether the elements are currently guaranteed sorted with respect to the compare function. |
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
37
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
38 The attributes can be accessed directly via the `collection` member of your struct, or with the following convenience macros.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
39
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
40 ```C
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
41 cxCollectionSize(c)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
42 cxCollectionElementSize(c)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
43 cxCollectionStoresPointers(c)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
44 cxCollectionSorted(c)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
45 ```
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
46
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
47 In each case the argument `c` is a pointer to your collection. The macro will then access the base data with `c->collection`.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
48
1618
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
49 ## Comparator Functions
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
50
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
51 For working with comparators, the following macros are defined:
1605
55b13f583356 refactor the list and map construction functions and remove the simple macros
Mike Becker <universe@uap-core.de>
parents: 1464
diff changeset
52
55b13f583356 refactor the list and map construction functions and remove the simple macros
Mike Becker <universe@uap-core.de>
parents: 1464
diff changeset
53 ```C
1618
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
54 cxSetCompareFunc(c, func)
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
55 cxSetAdvancedCompareFunc(c, func, data)
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
56
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
57 // use in your collection's implementation
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
58 cx_invoke_compare_func(c, left, right)
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
59
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
60 // the following two can be used to optimize loops
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
61 cx_invoke_simple_compare_func(c, left, right)
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
62 cx_invoke_advanced_compare_func(c, left, right)
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
63
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
64 // convenience macro for addressing and dereference elements in pointer collections
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
65 cx_ref(c, elem)
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
66 cx_deref(c, elem)
1605
55b13f583356 refactor the list and map construction functions and remove the simple macros
Mike Becker <universe@uap-core.de>
parents: 1464
diff changeset
67 ```
55b13f583356 refactor the list and map construction functions and remove the simple macros
Mike Becker <universe@uap-core.de>
parents: 1464
diff changeset
68
1618
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
69 If an advanced compare function is specified, `cx_invoke_compare_func()` will only invoke the advanced comparator.
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
70 Otherwise, the simple comparator is invoked.
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
71 If neither comparator is specified, invoking a comparator leads to undefined behavior.
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
72
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
73 In contrast to the destructors (below), comparators must always be invoked with a pointer to the element's data.
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
74 That means, if the collection is storing pointers, you must dereference the pointers to those pointers first, before invoking the comparator.
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
75 The reason for this is that the comparator cannot know if an argument points to an element of the collection or to external data the elements shall be compared with.
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
76
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
77 A typical use case would be this:
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
78
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
79 ```C
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
80 void *arg = // ... passed as argument, e.g. in cxListContains()
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
81 void *elem = // ... get a pointer to the element
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
82 void *data;
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
83
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
84 // manually ...
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
85 if (cxCollectionStoresPointers(this_collection)) {
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
86 data = *(void**)elem;
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
87 } else {
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
88 data = elem;
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
89 }
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
90
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
91 // ... or with the convenience macro
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
92 data = cx_deref(this_collection, elem);
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
93 int result = cx_invoke_compare_func(this_collection, data, arg);
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
94 ```
1464
9a10af83cfab add cxCollectionCompareFunc() macro
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
95
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1215
diff changeset
96 ## Destructor Functions
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1215
diff changeset
97
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
98 For working with destructors, the following macros are defined:
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
100 ```C
1605
55b13f583356 refactor the list and map construction functions and remove the simple macros
Mike Becker <universe@uap-core.de>
parents: 1464
diff changeset
101 cxSetDestructor(c, destr)
55b13f583356 refactor the list and map construction functions and remove the simple macros
Mike Becker <universe@uap-core.de>
parents: 1464
diff changeset
102 cxSetAdvancedDestructor(c, destr, data)
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
103
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
104 // use in your collection's implementation
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
105 cx_invoke_destructor(c, elem)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
106
1618
ef7cab6eb131 huge refactoring of collections to add support for 3-arg compare functions
Mike Becker <universe@uap-core.de>
parents: 1605
diff changeset
107 // the following two can be used to optimize loops
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
108 cx_invoke_simple_destructor(c, elem)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
109 cx_invoke_advanced_destructor(c, elem)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
110 ```
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
111
1605
55b13f583356 refactor the list and map construction functions and remove the simple macros
Mike Becker <universe@uap-core.de>
parents: 1464
diff changeset
112 With `cxSetDestructor()` you can assign a simple [destructor function](allocator.h.md#destructor-functions)
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
113 to an _instance_ of your collection.
1605
55b13f583356 refactor the list and map construction functions and remove the simple macros
Mike Becker <universe@uap-core.de>
parents: 1464
diff changeset
114 Similarly, you can assign an advanced destructor with custom `data` by using `cxSetAdvancedDestructor`.
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
115
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
116 Your collection _should_ be supporting destructors by invoking `cx_invoke_destructor()` whenever an element
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
117 is removed from your collection _without_ being returned to the caller.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
118 This macro will invoke a simple destructor, if one is assigned, first, and then the advanced destructor (again, if assigned).
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
119
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
120 > Destructor functions are always invoked with a pointer to the element in your collection.
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1215
diff changeset
121 > If your collection is storing pointers (i.e. `cxCollectionStoresPointers()` returns `true`)
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
122 > the `cx_invoke_destructor()` will make sure that the pointer to the element is dereferenced first,
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1239
diff changeset
123 > so that the destructor functions are _always_ invoked with a pointer to the actual element.
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
124 {style="note"}
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
125
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
126 <seealso>
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
127 <category ref="apidoc">
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
128 <a href="https://ucx.sourceforge.io/api/collection_8h.html">collection.h</a>
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
129 </category>
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
130 </seealso>

mercurial