Tue, 04 Oct 2022 19:25:07 +0200
fix over-optimization of strstr
1. it's actually less performant to frequently read bytes
from an array instead of using the native word length
2. the SBO buffer should be local and not static to allow
multi-threading usage
494
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | */ |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | /** |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | * \file iterator.h |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
30 | * \brief Interface for iterator implementations. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
31 | * \author Mike Becker |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
32 | * \author Olaf Wintermann |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
33 | * \version 3.0 |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
34 | * \copyright 2-Clause BSD License |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
35 | */ |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
36 | |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
37 | #ifndef UCX_ITERATOR_H |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
38 | #define UCX_ITERATOR_H |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
39 | |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
40 | #include "common.h" |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
41 | |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
42 | /** |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
43 | * Internal iterator struct - use CxIterator. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
44 | */ |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
45 | struct cx_iterator_s { |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
46 | /** |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
47 | * True iff the iterator points to valid data. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
48 | */ |
551
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
49 | __attribute__ ((__nonnull__)) |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
50 | bool (*valid)(struct cx_iterator_s const *); |
494
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
51 | |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
52 | /** |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
53 | * Returns a pointer to the current element. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
54 | */ |
551
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
55 | __attribute__ ((__nonnull__)) |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
56 | void *(*current)(struct cx_iterator_s const *); |
494
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
57 | |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
58 | /** |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
59 | * Advances the iterator. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
60 | */ |
551
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
61 | __attribute__ ((__nonnull__)) |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
62 | void (*next)(struct cx_iterator_s *); |
495
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
63 | |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
64 | /** |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
65 | * Handle for the current element, if required. |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
66 | */ |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
67 | void *elem_handle; |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
68 | |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
69 | /** |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
70 | * Handle for the source collection, if any. |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
71 | */ |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
72 | void *src_handle; |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
73 | |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
74 | /** |
551
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
75 | * Field for storing a key-value pair. |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
76 | * May be used by iterators that iterate over k/v-collections. |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
77 | */ |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
78 | struct { |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
79 | /** |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
80 | * A pointer to the key. |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
81 | */ |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
82 | void *key; |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
83 | /** |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
84 | * A pointer to the value. |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
85 | */ |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
86 | void *value; |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
87 | } kv_data; |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
88 | |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
89 | /** |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
90 | * Field for storing a slot number. |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
91 | * May be used by iterators that iterate over multi-bucket collections. |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
92 | */ |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
93 | size_t slot; |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
94 | |
2946e13c89a4
#189 implement map iterators
Mike Becker <universe@uap-core.de>
parents:
516
diff
changeset
|
95 | /** |
495
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
96 | * If the iterator is position-aware, contains the index of the element in the underlying collection. |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
97 | * Otherwise, this field is usually uninitialized. |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
98 | */ |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
99 | size_t index; |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
100 | |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
101 | /** |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
102 | * Users may set this to true, if the current element shall be removed from the underlying collection |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
103 | * when the iterator advances. |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
104 | * Has no effect on iterators that are not based on a collection. |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
105 | */ |
2856c74e18ba
add the feature to remove items during iteration
Mike Becker <universe@uap-core.de>
parents:
494
diff
changeset
|
106 | bool remove; |
494
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
107 | }; |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
108 | |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
109 | /** |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
110 | * Iterator value type. |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
111 | * An iterator points to a certain element in an (possibly unbounded) chain of elements. |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
112 | * Iterators that are based on collections (which have a defined "first" element), are supposed |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
113 | * to be "position-aware", which means that they keep track of the current index within the collection. |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
114 | * |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
115 | * @note Objects that are pointed to by an iterator are mutable through that iterator. However, if the |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
116 | * iterator is based on a collection and the underlying collection is mutated (elements added or removed), |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
117 | * the iterator becomes invalid (regardless of what cxIteratorValid() returns) and MUST be re-obtained |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
118 | * from the collection. |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
119 | */ |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
120 | typedef struct cx_iterator_s CxIterator; |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
121 | |
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
497
diff
changeset
|
122 | /** |
494
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
123 | * Checks if the iterator points to valid data. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
124 | * |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
125 | * This is especially false for past-the-end iterators. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
126 | * |
496 | 127 | * @param iter a pointer to the iterator |
494
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
128 | * @return true iff the iterator points to valid data |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
129 | */ |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
130 | __attribute__ ((__nonnull__)) |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
131 | static inline bool cxIteratorValid(CxIterator const *iter) { |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
132 | return iter->valid(iter); |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
133 | } |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
134 | |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
135 | /** |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
136 | * Returns a pointer to the current element. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
137 | * |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
138 | * The behavior is undefined if this iterator is invalid. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
139 | * |
496 | 140 | * @param iter a pointer to the iterator |
494
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
141 | * @return a pointer to the current element |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
142 | */ |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
143 | __attribute__ ((__nonnull__)) |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
144 | static inline void *cxIteratorCurrent(CxIterator const *iter) { |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
145 | return iter->current(iter); |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
146 | } |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
147 | |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
148 | /** |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
149 | * Advances the iterator to the next element. |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
150 | * |
496 | 151 | * @param iter a pointer to the iterator |
494
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
152 | */ |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
153 | __attribute__ ((__nonnull__)) |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
154 | static inline void cxIteratorNext(CxIterator *iter) { |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
155 | iter->next(iter); |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
156 | } |
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
157 | |
496 | 158 | /** |
159 | * Loops over an iterator. | |
160 | * @param type the type of the elements | |
161 | * @param elem the name of the iteration variable | |
162 | * @param iter the iterator | |
163 | */ | |
164 | #define cx_foreach(type, elem, iter) \ | |
516
7bcea73303ce
fix required cast if compiled with C++
Mike Becker <universe@uap-core.de>
parents:
500
diff
changeset
|
165 | for (type elem; cxIteratorValid(&iter) && (elem = (type)cxIteratorCurrent(&iter)) != NULL ; cxIteratorNext(&iter)) // NOLINT(bugprone-macro-parentheses) |
496 | 166 | |
494
6ce8cfa10a96
add iterator interface + linked list iterator
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
167 | #endif /* UCX_ITERATOR_H */ |