Sat, 08 Feb 2025 20:38:05 +0100
adds documentation for destructor functions and collections
also invented some new macros for the collection.h
relates to #451
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 |
10 | struct my_fancy_collection_s { | |
1171
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
11 | CX_COLLECTION_BASE; // adds a member named 'collection' |
1141 | 12 | struct my_collection_data_s *data; |
13 | }; | |
14 | ``` | |
1171
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
15 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
16 | > 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
|
17 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
18 | ## Base Attributes of a Collection |
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 | 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
|
21 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
22 | | Attribute | Description | |
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 | | `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
|
25 | | `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
|
26 | | `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
|
27 | | `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
|
28 | | `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
|
29 | | `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
|
30 | | `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
|
31 | | `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
|
32 | | `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
|
33 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
34 | 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
|
35 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
36 | ```C |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
37 | cxCollectionSize(c) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
38 | cxCollectionElementSize(c) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
39 | cxCollectionStoresPointers(c) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
40 | cxCollectionSorted(c) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
41 | ``` |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
42 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
43 | 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
|
44 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
45 | For working with destructors, the following macros are defined: |
1141 | 46 | |
1171
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
47 | ```C |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
48 | cxDefineDestructor(c, destr) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
49 | cxDefineAdvancedDestructor(c, destr, data) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
50 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
51 | // use in your collection's implementation |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
52 | cx_invoke_destructor(c, elem) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
53 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
54 | // 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
|
55 | cx_invoke_simple_destructor(c, elem) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
56 | cx_invoke_advanced_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 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
59 | 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
|
60 | to an _instance_ of your collection. |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
61 | 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
|
62 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
63 | 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
|
64 | 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
|
65 | 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
|
66 | |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
67 | > Destructor functions are always invoked with a pointer to the element in your collection. |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
68 | > If your collection is storing pointers (i.e. `cxCollectionStorePointers()` returns `true`) |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
69 | > 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
|
70 | > 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
|
71 | {style="note"} |
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 | <seealso> |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
74 | <category ref="apidoc"> |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
75 | <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
|
76 | </category> |
155bc3b0dcb3
adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
77 | </seealso> |