docs/Writerside/topics/iterator.h.md

Sun, 16 Feb 2025 12:59:14 +0100

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

add missing documentation about creating iterators

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
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
151c1b7d5d50 add missing documentation about creating iterators
Mike Becker <universe@uap-core.de>
parents: 1215
diff changeset
24 The following functions create iterators over plain C arrays:
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