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:
1141
diff
changeset
|
1 | # Collections |
1141 | 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 | 4 | If you want to implement an own collection data type that uses the same features, you can use the |
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 | 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 | 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 | 14 | struct my_collection_data_s *data; |
15 | }; | |
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 | |
1239
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
47 | ## Destructor Functions |
b4b1f15d1866
complete more than 80% of the list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
48 | |
1171
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
49 | For working with destructors, the following macros are defined: |
1141 | 50 | |
1171
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
51 | ```C |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
52 | cxDefineDestructor(c, destr) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
53 | cxDefineAdvancedDestructor(c, destr, data) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
54 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
55 | // use in your collection's implementation |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
56 | cx_invoke_destructor(c, elem) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
57 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
58 | // 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
|
59 | cx_invoke_simple_destructor(c, elem) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
60 | cx_invoke_advanced_destructor(c, elem) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
61 | ``` |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
62 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
63 | 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
|
64 | to an _instance_ of your collection. |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
65 | 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
|
66 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
67 | 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
|
68 | 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
|
69 | 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
|
70 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
71 | > 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
|
72 | > 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
|
73 | > the `cx_invoke_destructor()` will make sure that the pointer to the element is dereferenced first, |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
74 | > so that the destructor functions are _always_ invoked with pointer to the actual element. |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
75 | {style="note"} |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
76 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
77 | <seealso> |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
78 | <category ref="apidoc"> |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
79 | <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
|
80 | </category> |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
81 | </seealso> |