docs/Writerside/topics/iterator.h.md

Sun, 16 Feb 2025 12:40:51 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 16 Feb 2025 12:40:51 +0100
changeset 1215
790ff923f375
parent 1190
a7b913d5d589
child 1216
151c1b7d5d50
permissions
-rw-r--r--

add iterator documentation

relates to #451

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
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
22 ## Overview
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
23
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
24
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
25
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
26 ## Using an Iterator
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
27
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
28 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
29 and invoke the respective function pointers `valid`, `current`, or `next`.
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
30 ```C
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
31 cxIteratorValid(iter)
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
32 cxIteratorCurrent(iter)
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
33 cxIteratorNext(iter)
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
34 ```
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
35
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
36 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
37 Every iterator can be used with the `cx_foreach` macro.
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
38
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
39 ```C
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
40 #include <cx/iterator.h>
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
41
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
42 // some custom array and its size
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
43 MyData *array = // ...
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
44 size_t size = // ...
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
45
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
46 CxIterator iter = cxIterator(array, sizeof(MyData), size);
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
47 cx_foreach(MyData*, elem, iter) {
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
48 // .. do something with elem ..
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
49 }
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
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
52 The macro takes three arguments:
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
53 1. the pointer-type of a pointer to an element,
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
54 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
55 3. and the iterator.
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
56
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
57 > 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
58 > 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
59 > 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
60 >
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
61 > 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
62 > what exactly the iterator is iterating over.
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 ## Mutating Iterators
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
65
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 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
67 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
68
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 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
70 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
71 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
72 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
73 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
74
1215
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
75 ## Passing Iterators to Functions
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 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
78 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
79
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
80 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
81 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
82 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
83
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
84 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
85
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
86 ```C
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
87 CxList *list = // ...
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
88 CxTree *tree = // ...
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
89
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
90 CxIterator iter = cxListIterator(list);
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
91 cxTreeInsertIter(tree, cxIteratorRef(iter), cxListSize(list));
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
92 ```
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
93
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
94 > 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
95 > 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
96 {style="note"}
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
97
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
98 ## Custom Iterators
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
99
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
100 The base structure is defined as follows:
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
101 ```C
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
102 struct cx_iterator_base_s {
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
103 bool (*valid)(const void *);
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
104 void *(*current)(const void *);
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
105 void *(*current_impl)(const void *);
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
106 void (*next)(void *);
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
107 bool mutating;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
108 bool remove;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
109 };
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 typedef struct cx_iterator_base_s CxIteratorBase;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
112 ```
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
113
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
114 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
115 The `current` function is supposed to return that element,
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
116 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
117 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
118
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
119 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
120 called by a wrapper implementation pointed to by `current`.
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
121 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
122
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
123 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
124 that does not support mutation, can be implemented as follows:
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
125 ```C
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
126 #include <cx/iterator.h>
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
127
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
128 typedef struct my_foo_s {
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
129 // ... your data ...
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
130 } MyFoo;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
131
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
132 typedef struct my_foo_iterator_s {
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
133 CX_ITERATOR_BASE;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
134 MyFoo *array;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
135 size_t index;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
136 size_t elem_count;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
137 } MyFooIterator;
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 static bool my_foo_iter_valid(const void *it) {
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
140 const MyFooIterator *iter = it;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
141 return iter->index < iter->elem_count;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
142 }
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 static void *my_foo_iter_current(const void *it) {
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
145 const MyFooIterator *iter = it;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
146 return &iter->array[iter->index];
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
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
149 static void my_foo_iter_next(void *it) {
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
150 MyFooIterator *iter = it;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
151 iter->index++;
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
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
154 MyFooIterator myFooIterator(MyFoo *array, size_t elem_count) {
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
155 MyFooIterator iter;
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 // base fields
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
158 iter.base.valid = my_foo_iter_valid;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
159 iter.base.current = my_foo_iter_current;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
160 iter.base.next = my_foo_iter_next;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
161 iter.base.remove = false;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
162 iter.base.mutating = false;
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 // custom fields
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
165 iter.index = 0;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
166 iter.elem_count = 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 return iter;
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
169 }
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
170 ```
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
171
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
172 > 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
173 > 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
174 > 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
175 {style="note"}
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
176
790ff923f375 add iterator documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
177 > 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
178 > 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
179
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
180 <seealso>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
181 <category ref="apidoc">
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
182 <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
183 </category>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
184 </seealso>

mercurial