docs/Writerside/topics/collection.h.md

Sun, 23 Nov 2025 13:15:19 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 23 Nov 2025 13:15:19 +0100
changeset 1508
dfc0ddd9571e
parent 1464
9a10af83cfab
permissions
-rw-r--r--

optimize sorted insertion by using the infimum instead of the supremum

The reason is that the supremum returns the equal element with the smallest index, and we want the largest.
Therefore, we use the infimum, which already gives us the largest index when there are equal elements, and increase the index by one. The infimum is also guaranteed to exist in that case.

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 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
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
24 | Attribute | Description |
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
25 |-----------------------|----------------------------------------------------------------------------------------------------------------|
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
26 | `allocator` | The [allocator](allocator.h.md) that shall be used for the collection data. |
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
27 | `cmpfunc` | A function to [compare](compare.h.md) two elements. |
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
28 | `elem_size` | The size of one element in bytes. |
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
29 | `size` | The size, meaning the number of elements, currently stored. |
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
30 | `simple_destructor` | An optional simple [destructor function](allocator.h.md#destructor-functions). |
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
31 | `advanced_destructor` | An optional advanced destructor function. |
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
32 | `destructor_data` | A pointer to the custom data that shall be passed to the advanced destructor. |
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
33 | `store_pointer` | A `bool` indicating whether this collection stores pointers instead of the element's data. |
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
34 | `sorted` | A `bool` indicating whether the elements are currently guaranteed sorted with respect to the compare function. |
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
35
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
36 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
37
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
38 ```C
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
39 cxCollectionSize(c)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
40 cxCollectionElementSize(c)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
41 cxCollectionStoresPointers(c)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
42 cxCollectionSorted(c)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
43 ```
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
44
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
45 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
46
1464
9a10af83cfab add cxCollectionCompareFunc() macro
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
47 Similar to the above macros, the `cxCollectionCompareFunc(c,f)` macro can be used to set the compare function.
9a10af83cfab add cxCollectionCompareFunc() macro
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
48
1239
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1215
diff changeset
49 ## Destructor Functions
b4b1f15d1866 complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents: 1215
diff changeset
50
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
51 For working with destructors, the following macros are defined:
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
53 ```C
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
54 cxDefineDestructor(c, destr)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
55 cxDefineAdvancedDestructor(c, destr, data)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
56
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
57 // use in your collection's implementation
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
58 cx_invoke_destructor(c, elem)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
59
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
60 // the following two should not be used
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
61 cx_invoke_simple_destructor(c, elem)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
62 cx_invoke_advanced_destructor(c, elem)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
63 ```
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
64
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
65 With `cxDefineDestructor()` you can assign a simple [destructor function](allocator.h.md#destructor-functions)
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
66 to an _instance_ of your collection.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
67 Similarly, you can assign an advanced destructor with custom `data` by using `cxDefineAdvancedDestructor`.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
68
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
69 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
70 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
71 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
72
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
73 > 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
74 > 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
75 > 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
76 > 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
77 {style="note"}
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
78
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
79 <seealso>
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
80 <category ref="apidoc">
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
81 <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
82 </category>
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
83 </seealso>

mercurial