Sat, 11 Oct 2025 11:55:46 +0200
changes the compare function wrapper for pointer lists so that it no longer invokes the actual compare function for NULL pointers
1143
0559812df10c
assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents:
1142
diff
changeset
|
1 | # Iterators |
1141 | 2 | |
1215
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
3 | Iterators generalize the iteration over elements of an arbitrary collection. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
4 | This allows iteration over arrays, lists, maps, trees, etc. in a unified way. |
1146
151c057faf7c
add marker to every incomplete page
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
5 | |
1215
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
6 | Creating an iterator is as simple as creating a `CxIterator` struct and setting the fields in a meaningful way. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
7 | The UCX collections provide various functions to create such iterators. |
1141 | 8 | |
1215
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
9 | If the predefined fields are insufficient (or introduce too much bloat) for your use case, |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
10 | you can alternatively create your own iterator structure |
1141 | 11 | and place the `CX_ITERATOR_BASE` macro as first member of that structure. |
12 | ||
1215
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
13 | ```C |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
14 | #include <cx/iterator.h> |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
15 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
16 | struct my_fancy_iterator_s { |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
17 | CX_ITERATOR_BASE; // the base members used by cx_foreach() |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
18 | // ... custom fields ... |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
19 | }; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
20 | ``` |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
21 | |
1216
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
22 | ## Creating an Iterator |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
23 | |
1245
721e2032fa25
define structure for array_list.h documentation
Mike Becker <universe@uap-core.de>
parents:
1216
diff
changeset
|
24 | The following functions create iterators over plain C arrays. |
1216
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
25 | |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
26 | ```C |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
27 | #include <cx/iterator.h> |
1215
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
28 | |
1216
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
29 | CxIterator cxIterator(const void *array, |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
30 | size_t elem_size, size_t elem_count); |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
31 | |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
32 | CxIterator cxMutIterator(void *array, |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
33 | size_t elem_size, size_t elem_count, bool remove_keeps_order); |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
34 | |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
35 | CxIterator cxIteratorPtr(const void *array, size_t elem_count); |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
36 | |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
37 | CxIterator cxMutIteratorPtr(void *array, size_t elem_count, |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
38 | bool remove_keeps_order); |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
39 | ``` |
1215
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
40 | |
1216
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
41 | The `cxIterator()` function creates an iterator over the elements of `array` where |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
42 | each element is `elem_size` bytes large and the array contains a total of `elem_count` elements. |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
43 | The `cxMutIterator()` function creates an equivalent [mutating iterator](#mutating-iterators). |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
44 | |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
45 | The `cxIteratorPtr()` and `cxMutIteratorPtr()` functions are equivalent to |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
46 | the `cxIteratorPtr()` and `cxMutIteratorPtr()`, except they assume `sizeof(void*)` as the `elem_size`. |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
47 | |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
48 | The UCX collections also define functions for creating iterators over their items. |
151c1b7d5d50
add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents:
1215
diff
changeset
|
49 | You can read more about them in the respective Sections of the documentation. |
1215
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
50 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
51 | ## Using an Iterator |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
52 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
53 | The following macros work with arbitrary structures using `CX_ITERATOR_BASE` |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
54 | and invoke the respective function pointers `valid`, `current`, or `next`. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
55 | ```C |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
56 | cxIteratorValid(iter) |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
57 | cxIteratorCurrent(iter) |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
58 | cxIteratorNext(iter) |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
59 | ``` |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
60 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
61 | You may use them for manual iterator, but usually you do not need them. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
62 | Every iterator can be used with the `cx_foreach` macro. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
63 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
64 | ```C |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
65 | #include <cx/iterator.h> |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
66 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
67 | // some custom array and its size |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
68 | MyData *array = // ... |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
69 | size_t size = // ... |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
70 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
71 | CxIterator iter = cxIterator(array, sizeof(MyData), size); |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
72 | cx_foreach(MyData*, elem, iter) { |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
73 | // .. do something with elem .. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
74 | } |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
75 | ``` |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
76 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
77 | The macro takes three arguments: |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
78 | 1. the pointer-type of a pointer to an element, |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
79 | 2. the name of the variable you want to use for accessing the element, |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
80 | 3. and the iterator. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
81 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
82 | > An iterator does not necessarily need to iterate over the elements of a collections. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
83 | > Map iterators, for example, can iterator over the key/value pairs, |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
84 | > but they can also iterate over just the values or just the keys. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
85 | > |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
86 | > You should read the documentation of the function creating the iterator to learn |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
87 | > what exactly the iterator is iterating over. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
88 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
89 | ## Mutating Iterators |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
90 | |
1141 | 91 | Usually an iterator is not mutating the collection it is iterating over. |
92 | But sometimes it is desirable to remove an element from the collection while iterating over it. | |
1215
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
93 | |
1141 | 94 | For this purpose, most collections allow the creation of a _mutating_ iterator. |
1215
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
95 | On mutating iterators the `mutating` flag in the base structure is set to `true`, |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
96 | and it is allowed to call the `cxFlagForRemoval()` function, which instructs the iterator to remove |
1141 | 97 | the current element from the collection on the next call to `cxIteratorNext()` and clear the flag afterward. |
98 | If you are implementing your own iterator, it is up to you to implement this behavior. | |
1142
9437530176bc
add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents:
1141
diff
changeset
|
99 | |
1215
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
100 | ## Passing Iterators to Functions |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
101 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
102 | To eliminate the need of memory management for iterators, the structures are usually used by value. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
103 | This does not come with additional costs, because iteration is implemented entirely by macros. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
104 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
105 | However, sometimes it is necessary to pass an iterator to another function. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
106 | To make that possible in a generalized way, such functions should accept a `CxIteratorBase*` pointer |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
107 | which can be obtained with the `cxIteratorRef()` macro on the calling site. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
108 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
109 | In the following example, elements from a list are inserted into a tree: |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
110 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
111 | ```C |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
112 | CxList *list = // ... |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
113 | CxTree *tree = // ... |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
114 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
115 | CxIterator iter = cxListIterator(list); |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
116 | cxTreeInsertIter(tree, cxIteratorRef(iter), cxListSize(list)); |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
117 | ``` |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
118 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
119 | > This is the reason, why `CX_ITERATOR_BASE` must be the first member of any iterator structure. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
120 | > Otherwise, the address taken by `cxIteratorRef()` would not equal the address of the iterator. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
121 | {style="note"} |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
122 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
123 | ## Custom Iterators |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
124 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
125 | The base structure is defined as follows: |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
126 | ```C |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
127 | struct cx_iterator_base_s { |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
128 | bool (*valid)(const void *); |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
129 | void *(*current)(const void *); |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
130 | void *(*current_impl)(const void *); |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
131 | void (*next)(void *); |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
132 | bool mutating; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
133 | bool remove; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
134 | }; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
135 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
136 | typedef struct cx_iterator_base_s CxIteratorBase; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
137 | ``` |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
138 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
139 | The `valid` function indicates whether the iterator is currently pointing to an element in the collection. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
140 | The `current` function is supposed to return that element, |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
141 | and the `next` function shall advance the iterator to the next element. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
142 | The booleans `mutating` and `remove` are used for [mutating iterators](#mutating-iterators) as explained above. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
143 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
144 | Iterators may be wrapped in which case the original implementation can be stored in `current_impl` and |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
145 | called by a wrapper implementation pointed to by `current`. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
146 | This can be useful when you want to support the `store_pointer` field of the [](collection.h.md) API. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
147 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
148 | A specialized, simple, and fast iterator over an array of a certain type, |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
149 | that does not support mutation, can be implemented as follows: |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
150 | ```C |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
151 | #include <cx/iterator.h> |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
152 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
153 | typedef struct my_foo_s { |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
154 | // ... your data ... |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
155 | } MyFoo; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
156 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
157 | typedef struct my_foo_iterator_s { |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
158 | CX_ITERATOR_BASE; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
159 | MyFoo *array; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
160 | size_t index; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
161 | size_t elem_count; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
162 | } MyFooIterator; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
163 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
164 | static bool my_foo_iter_valid(const void *it) { |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
165 | const MyFooIterator *iter = it; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
166 | return iter->index < iter->elem_count; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
167 | } |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
168 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
169 | static void *my_foo_iter_current(const void *it) { |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
170 | const MyFooIterator *iter = it; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
171 | return &iter->array[iter->index]; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
172 | } |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
173 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
174 | static void my_foo_iter_next(void *it) { |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
175 | MyFooIterator *iter = it; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
176 | iter->index++; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
177 | } |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
178 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
179 | MyFooIterator myFooIterator(MyFoo *array, size_t elem_count) { |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
180 | MyFooIterator iter; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
181 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
182 | // base fields |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
183 | iter.base.valid = my_foo_iter_valid; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
184 | iter.base.current = my_foo_iter_current; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
185 | iter.base.next = my_foo_iter_next; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
186 | iter.base.remove = false; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
187 | iter.base.mutating = false; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
188 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
189 | // custom fields |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
190 | iter.index = 0; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
191 | iter.elem_count = elem_count; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
192 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
193 | return iter; |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
194 | } |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
195 | ``` |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
196 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
197 | > Note, that the behavior of `current` is undefined when `valid` returns `false`. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
198 | > That means, on the one hand, `current` does not need to check for validity of the iterator, |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
199 | > but on the other hand it is forbidden to invoke `current` when `valid` would return `false`. |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
200 | {style="note"} |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
201 | |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
202 | > If performance matters in your application, it is recommended that you indeed create specialized iterators |
790ff923f375
add iterator documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
203 | > for your collections. The default UCX implementations trade some of the performance for generality. |
1190
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
204 | |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
205 | <seealso> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
206 | <category ref="apidoc"> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
207 | <a href="https://ucx.sourceforge.io/api/iterator_8h.html">iterator.h</a> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
208 | </category> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
209 | </seealso> |