Sun, 16 Feb 2025 12:59:14 +0100
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 | 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 | |
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 | 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> |