docs/Writerside/topics/collection.h.md

Sat, 08 Feb 2025 20:38:05 +0100

author
Mike Becker <universe@uap-core.de>
date
Sat, 08 Feb 2025 20:38:05 +0100
branch
docs/3.1
changeset 1171
155bc3b0dcb3
parent 1146
151c057faf7c
permissions
-rw-r--r--

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
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 struct my_collection_data_s *data;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 };
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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>

mercurial