docs/Writerside/topics/iterator.h.md

Sat, 11 Oct 2025 11:55:46 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 11 Oct 2025 11:55:46 +0200
changeset 1422
8bfccb342895
parent 1245
721e2032fa25
permissions
-rw-r--r--

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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 and place the `CX_ITERATOR_BASE` macro as first member of that structure.
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
91 Usually an iterator is not mutating the collection it is iterating over.
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
97 the current element from the collection on the next call to `cxIteratorNext()` and clear the flag afterward.
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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>

mercurial