Sun, 02 Nov 2025 18:04:35 +0100
difference shall not check already present items in the destination - fixes #753
| 
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 | /** | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
29 | * @file iterator.h | 
| 
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
30 | * @brief Interface for iterator implementations. | 
| 
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
31 | * @author Mike Becker | 
| 
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
32 | * @author Olaf Wintermann | 
| 
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
33 | * @copyright 2-Clause BSD License | 
| 
494
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
34 | */ | 
| 
 
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 | #ifndef UCX_ITERATOR_H | 
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
37 | #define UCX_ITERATOR_H | 
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
38 | |
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
39 | #include "common.h" | 
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
40 | |
| 
933
 
40bf2f212d2a
add extern "C" to iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
890 
diff
changeset
 | 
41 | #ifdef __cplusplus | 
| 
 
40bf2f212d2a
add extern "C" to iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
890 
diff
changeset
 | 
42 | extern "C" { | 
| 
 
40bf2f212d2a
add extern "C" to iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
890 
diff
changeset
 | 
43 | #endif | 
| 
 
40bf2f212d2a
add extern "C" to iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
890 
diff
changeset
 | 
44 | |
| 
1035
 
9b6ded88d7a0
add missing documentation in iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
985 
diff
changeset
 | 
45 | /** | 
| 
 
9b6ded88d7a0
add missing documentation in iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
985 
diff
changeset
 | 
46 | * Common data for all iterators. | 
| 
 
9b6ded88d7a0
add missing documentation in iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
985 
diff
changeset
 | 
47 | */ | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
48 | struct cx_iterator_base_s { | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
49 | /** | 
| 
1192
 
1f69336faa63
fix some typos - issue #548
 
Olaf Wintermann <olaf.wintermann@gmail.com> 
parents: 
1180 
diff
changeset
 | 
50 | * True if the iterator points to valid data. | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
51 | */ | 
| 
890
 
54565fd74e74
move all const keywords to the west - fixes #426
 
Mike Becker <universe@uap-core.de> 
parents: 
858 
diff
changeset
 | 
52 | bool (*valid)(const void *); | 
| 
1432
 
fb82e7a92258
add possibility to wrap valid function of an iterator (just for the sake of completeness)
 
Mike Becker <universe@uap-core.de> 
parents: 
1429 
diff
changeset
 | 
53 | /** | 
| 
 
fb82e7a92258
add possibility to wrap valid function of an iterator (just for the sake of completeness)
 
Mike Becker <universe@uap-core.de> 
parents: 
1429 
diff
changeset
 | 
54 | * Original implementation in case the function needs to be wrapped. | 
| 
 
fb82e7a92258
add possibility to wrap valid function of an iterator (just for the sake of completeness)
 
Mike Becker <universe@uap-core.de> 
parents: 
1429 
diff
changeset
 | 
55 | */ | 
| 
 
fb82e7a92258
add possibility to wrap valid function of an iterator (just for the sake of completeness)
 
Mike Becker <universe@uap-core.de> 
parents: 
1429 
diff
changeset
 | 
56 | bool (*valid_impl)(const void *); | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
57 | /** | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
58 | * Returns a pointer to the current element. | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
59 | * | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
60 | * When valid returns false, the behavior of this function is undefined. | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
61 | */ | 
| 
890
 
54565fd74e74
move all const keywords to the west - fixes #426
 
Mike Becker <universe@uap-core.de> 
parents: 
858 
diff
changeset
 | 
62 | void *(*current)(const void *); | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
63 | |
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
64 | /** | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
65 | * Original implementation in case the function needs to be wrapped. | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
66 | */ | 
| 
890
 
54565fd74e74
move all const keywords to the west - fixes #426
 
Mike Becker <universe@uap-core.de> 
parents: 
858 
diff
changeset
 | 
67 | void *(*current_impl)(const void *); | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
68 | /** | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
69 | * Advances the iterator. | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
70 | * | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
71 | * When valid returns false, the behavior of this function is undefined. | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
72 | */ | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
73 | void (*next)(void *); | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
74 | /** | 
| 
1386
 
748d0d40881e
kv-list: implement mutating iterator support
 
Mike Becker <universe@uap-core.de> 
parents: 
1214 
diff
changeset
 | 
75 | * Original implementation in case the function needs to be wrapped. | 
| 
 
748d0d40881e
kv-list: implement mutating iterator support
 
Mike Becker <universe@uap-core.de> 
parents: 
1214 
diff
changeset
 | 
76 | */ | 
| 
 
748d0d40881e
kv-list: implement mutating iterator support
 
Mike Becker <universe@uap-core.de> 
parents: 
1214 
diff
changeset
 | 
77 | void (*next_impl)(void *); | 
| 
 
748d0d40881e
kv-list: implement mutating iterator support
 
Mike Becker <universe@uap-core.de> 
parents: 
1214 
diff
changeset
 | 
78 | /** | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
79 | * Indicates whether this iterator may remove elements. | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
80 | */ | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
81 | bool allow_remove; | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
82 | /** | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
83 | * Internal flag for removing the current element when advancing. | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
84 | */ | 
| 
853
 
d4baf4dd55c3
simplify iterator structures
 
Mike Becker <universe@uap-core.de> 
parents: 
852 
diff
changeset
 | 
85 | bool remove; | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
86 | }; | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
87 | |
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
88 | /** | 
| 
1214
 
ee4e33284f0c
add convenience type CxIteratorBase
 
Mike Becker <universe@uap-core.de> 
parents: 
1193 
diff
changeset
 | 
89 | * Convenience type definition for the base structure of an iterator. | 
| 
 
ee4e33284f0c
add convenience type CxIteratorBase
 
Mike Becker <universe@uap-core.de> 
parents: 
1193 
diff
changeset
 | 
90 | * @see #CX_ITERATOR_BASE | 
| 
 
ee4e33284f0c
add convenience type CxIteratorBase
 
Mike Becker <universe@uap-core.de> 
parents: 
1193 
diff
changeset
 | 
91 | */ | 
| 
 
ee4e33284f0c
add convenience type CxIteratorBase
 
Mike Becker <universe@uap-core.de> 
parents: 
1193 
diff
changeset
 | 
92 | typedef struct cx_iterator_base_s CxIteratorBase; | 
| 
 
ee4e33284f0c
add convenience type CxIteratorBase
 
Mike Becker <universe@uap-core.de> 
parents: 
1193 
diff
changeset
 | 
93 | |
| 
 
ee4e33284f0c
add convenience type CxIteratorBase
 
Mike Becker <universe@uap-core.de> 
parents: 
1193 
diff
changeset
 | 
94 | /** | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
95 | * Declares base attributes for an iterator. | 
| 
858
 
d9ad7904c4c2
add cxIteratorRef() macro
 
Mike Becker <universe@uap-core.de> 
parents: 
854 
diff
changeset
 | 
96 | * Must be the first member of an iterator structure. | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
97 | */ | 
| 
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
98 | #define CX_ITERATOR_BASE struct cx_iterator_base_s base | 
| 
494
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
99 | |
| 
853
 
d4baf4dd55c3
simplify iterator structures
 
Mike Becker <universe@uap-core.de> 
parents: 
852 
diff
changeset
 | 
100 | /** | 
| 
 
d4baf4dd55c3
simplify iterator structures
 
Mike Becker <universe@uap-core.de> 
parents: 
852 
diff
changeset
 | 
101 | * Internal iterator struct - use CxIterator. | 
| 
 
d4baf4dd55c3
simplify iterator structures
 
Mike Becker <universe@uap-core.de> 
parents: 
852 
diff
changeset
 | 
102 | */ | 
| 
 
d4baf4dd55c3
simplify iterator structures
 
Mike Becker <universe@uap-core.de> 
parents: 
852 
diff
changeset
 | 
103 | struct cx_iterator_s { | 
| 
1035
 
9b6ded88d7a0
add missing documentation in iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
985 
diff
changeset
 | 
104 | /** | 
| 
 
9b6ded88d7a0
add missing documentation in iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
985 
diff
changeset
 | 
105 | * Inherited common data for all iterators. | 
| 
 
9b6ded88d7a0
add missing documentation in iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
985 
diff
changeset
 | 
106 | */ | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
107 | CX_ITERATOR_BASE; | 
| 
641
 
d402fead3386
add new pointer list wrapper - resolves #234
 
Mike Becker <universe@uap-core.de> 
parents: 
630 
diff
changeset
 | 
108 | |
| 
 
d402fead3386
add new pointer list wrapper - resolves #234
 
Mike Becker <universe@uap-core.de> 
parents: 
630 
diff
changeset
 | 
109 | /** | 
| 
853
 
d4baf4dd55c3
simplify iterator structures
 
Mike Becker <universe@uap-core.de> 
parents: 
852 
diff
changeset
 | 
110 | * Handle for the current element. | 
| 
495
 
2856c74e18ba
add the feature to remove items during iteration
 
Mike Becker <universe@uap-core.de> 
parents: 
494 
diff
changeset
 | 
111 | */ | 
| 
 
2856c74e18ba
add the feature to remove items during iteration
 
Mike Becker <universe@uap-core.de> 
parents: 
494 
diff
changeset
 | 
112 | void *elem_handle; | 
| 
 
2856c74e18ba
add the feature to remove items during iteration
 
Mike Becker <universe@uap-core.de> 
parents: 
494 
diff
changeset
 | 
113 | |
| 
 
2856c74e18ba
add the feature to remove items during iteration
 
Mike Becker <universe@uap-core.de> 
parents: 
494 
diff
changeset
 | 
114 | /** | 
| 
 
2856c74e18ba
add the feature to remove items during iteration
 
Mike Becker <universe@uap-core.de> 
parents: 
494 
diff
changeset
 | 
115 | * 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
 | 
116 | */ | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
117 | void *src_handle; | 
| 
495
 
2856c74e18ba
add the feature to remove items during iteration
 
Mike Becker <universe@uap-core.de> 
parents: 
494 
diff
changeset
 | 
118 | |
| 
 
2856c74e18ba
add the feature to remove items during iteration
 
Mike Becker <universe@uap-core.de> 
parents: 
494 
diff
changeset
 | 
119 | /** | 
| 
 
2856c74e18ba
add the feature to remove items during iteration
 
Mike Becker <universe@uap-core.de> 
parents: 
494 
diff
changeset
 | 
120 | * 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
 | 
121 | * 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
 | 
122 | */ | 
| 
 
2856c74e18ba
add the feature to remove items during iteration
 
Mike Becker <universe@uap-core.de> 
parents: 
494 
diff
changeset
 | 
123 | size_t index; | 
| 
850
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
124 | |
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
125 | /** | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
126 | * The size of an individual element. | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
127 | */ | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
128 | size_t elem_size; | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
129 | |
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
130 | /** | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
131 | * May contain the total number of elements, if known. | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
132 | * Shall be set to @c SIZE_MAX when the total number is unknown during iteration. | 
| 
850
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
133 | */ | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
134 | size_t elem_count; | 
| 
630
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
135 | }; | 
| 
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
136 | |
| 
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
137 | /** | 
| 
853
 
d4baf4dd55c3
simplify iterator structures
 
Mike Becker <universe@uap-core.de> 
parents: 
852 
diff
changeset
 | 
138 | * Iterator type. | 
| 
630
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
139 | * | 
| 
740
 
378578666c83
fix iterator doc
 
Olaf Wintermann <olaf.wintermann@gmail.com> 
parents: 
704 
diff
changeset
 | 
140 | * An iterator points to a certain element in a (possibly unbounded) chain of elements. | 
| 
1424
 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 
Mike Becker <universe@uap-core.de> 
parents: 
1386 
diff
changeset
 | 
141 | * Iterators that are based on collections (which have a defined "first" element) are supposed | 
| 
500
 
eb9e7bd40a8e
do not hide pointers behind typedefs
 
Mike Becker <universe@uap-core.de> 
parents: 
497 
diff
changeset
 | 
142 | * 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
 | 
143 | * | 
| 
630
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
144 | * @note Objects that are pointed to by an iterator are always mutable through that iterator. However, | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
145 | * any concurrent mutation of the collection other than by this iterator makes this iterator obsolete, | 
| 
853
 
d4baf4dd55c3
simplify iterator structures
 
Mike Becker <universe@uap-core.de> 
parents: 
852 
diff
changeset
 | 
146 | * and it must not be used anymore. | 
| 
500
 
eb9e7bd40a8e
do not hide pointers behind typedefs
 
Mike Becker <universe@uap-core.de> 
parents: 
497 
diff
changeset
 | 
147 | */ | 
| 
 
eb9e7bd40a8e
do not hide pointers behind typedefs
 
Mike Becker <universe@uap-core.de> 
parents: 
497 
diff
changeset
 | 
148 | typedef struct cx_iterator_s CxIterator; | 
| 
 
eb9e7bd40a8e
do not hide pointers behind typedefs
 
Mike Becker <universe@uap-core.de> 
parents: 
497 
diff
changeset
 | 
149 | |
| 
 
eb9e7bd40a8e
do not hide pointers behind typedefs
 
Mike Becker <universe@uap-core.de> 
parents: 
497 
diff
changeset
 | 
150 | /** | 
| 
494
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
151 | * Checks if the iterator points to valid data. | 
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
152 | * | 
| 
630
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
153 | * @param iter the iterator | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
154 | * @retval true if the iterator points to valid data | 
| 
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
155 | * @retval false if the iterator already moved past the end | 
| 
494
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
156 | */ | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
157 | #define cxIteratorValid(iter) (iter).base.valid(&(iter)) | 
| 
494
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
158 | |
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
159 | /** | 
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
160 | * Returns a pointer to the current element. | 
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
161 | * | 
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
162 | * 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
 | 
163 | * | 
| 
630
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
164 | * @param iter the iterator | 
| 
494
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
165 | * @return a pointer to the current element | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
166 | * @see cxIteratorValid() | 
| 
494
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
167 | */ | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
168 | #define cxIteratorCurrent(iter) (iter).base.current(&iter) | 
| 
494
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
169 | |
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
170 | /** | 
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
171 | * Advances the iterator to the next element. | 
| 
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
172 | * | 
| 
630
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
173 | * @param iter the iterator | 
| 
494
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
174 | */ | 
| 
854
 
fe0d69d72bcd
fix members inherited by macro or include are not documented
 
Mike Becker <universe@uap-core.de> 
parents: 
853 
diff
changeset
 | 
175 | #define cxIteratorNext(iter) (iter).base.next(&iter) | 
| 
630
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
176 | |
| 
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
177 | /** | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
178 | * Flags the current element for removal if the iterator allows it. | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
179 | * | 
| 
630
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
180 | * @param iter the iterator | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
181 | * @return @c true if removal is allowed, @c false otherwise | 
| 
630
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
182 | */ | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
183 | #define cxIteratorFlagRemoval(iter) ((iter).base.remove = (iter).base.allow_remove) | 
| 
494
 
6ce8cfa10a96
add iterator interface + linked list iterator
 
Mike Becker <universe@uap-core.de> 
parents:  
diff
changeset
 | 
184 | |
| 496 | 185 | /** | 
| 
858
 
d9ad7904c4c2
add cxIteratorRef() macro
 
Mike Becker <universe@uap-core.de> 
parents: 
854 
diff
changeset
 | 
186 | * Obtains a reference to an arbitrary iterator. | 
| 
 
d9ad7904c4c2
add cxIteratorRef() macro
 
Mike Becker <universe@uap-core.de> 
parents: 
854 
diff
changeset
 | 
187 | * | 
| 
 
d9ad7904c4c2
add cxIteratorRef() macro
 
Mike Becker <universe@uap-core.de> 
parents: 
854 
diff
changeset
 | 
188 | * This is useful for APIs that expect some iterator as an argument. | 
| 
 
d9ad7904c4c2
add cxIteratorRef() macro
 
Mike Becker <universe@uap-core.de> 
parents: 
854 
diff
changeset
 | 
189 | * | 
| 
 
d9ad7904c4c2
add cxIteratorRef() macro
 
Mike Becker <universe@uap-core.de> 
parents: 
854 
diff
changeset
 | 
190 | * @param iter the iterator | 
| 
1214
 
ee4e33284f0c
add convenience type CxIteratorBase
 
Mike Becker <universe@uap-core.de> 
parents: 
1193 
diff
changeset
 | 
191 | * @return (@c struct @c cx_iterator_base_s*) a pointer to the iterator | 
| 
858
 
d9ad7904c4c2
add cxIteratorRef() macro
 
Mike Becker <universe@uap-core.de> 
parents: 
854 
diff
changeset
 | 
192 | */ | 
| 
 
d9ad7904c4c2
add cxIteratorRef() macro
 
Mike Becker <universe@uap-core.de> 
parents: 
854 
diff
changeset
 | 
193 | #define cxIteratorRef(iter) &((iter).base) | 
| 
 
d9ad7904c4c2
add cxIteratorRef() macro
 
Mike Becker <universe@uap-core.de> 
parents: 
854 
diff
changeset
 | 
194 | |
| 
 
d9ad7904c4c2
add cxIteratorRef() macro
 
Mike Becker <universe@uap-core.de> 
parents: 
854 
diff
changeset
 | 
195 | /** | 
| 496 | 196 | * Loops over an iterator. | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
197 | * | 
| 496 | 198 | * @param type the type of the elements | 
| 199 | * @param elem the name of the iteration variable | |
| 200 | * @param iter the iterator | |
| 201 | */ | |
| 202 | #define cx_foreach(type, elem, iter) \ | |
| 
630
 
ac5e7f789048
separate iterators and mutating iterators
 
Mike Becker <universe@uap-core.de> 
parents: 
628 
diff
changeset
 | 
203 | for (type elem; cxIteratorValid(iter) && (elem = (type)cxIteratorCurrent(iter)) != NULL ; cxIteratorNext(iter)) | 
| 496 | 204 | |
| 
850
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
205 | |
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
206 | /** | 
| 852 | 207 | * Creates an iterator for the specified plain array. | 
| 
851
 
adb4e0737c33
issue #389 : add separate function for immutable arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
850 
diff
changeset
 | 
208 | * | 
| 
1424
 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 
Mike Becker <universe@uap-core.de> 
parents: 
1386 
diff
changeset
 | 
209 | * The @p array can be @c NULL, in which case the iterator will be immediately | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
210 | * initialized such that #cxIteratorValid() returns @c false. | 
| 
851
 
adb4e0737c33
issue #389 : add separate function for immutable arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
850 
diff
changeset
 | 
211 | * | 
| 
1070
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
212 | * This iterator yields the addresses of the array elements. | 
| 
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
213 | * If you want to iterator over an array of pointers, you can | 
| 
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
214 | * use cxIteratorPtr() to create an iterator which directly | 
| 
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
215 | * yields the stored pointers. | 
| 
851
 
adb4e0737c33
issue #389 : add separate function for immutable arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
850 
diff
changeset
 | 
216 | * | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
217 | * While the iterator is in use, the array may only be altered by removing | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
218 | * elements through #cxIteratorFlagRemoval(). Every other change to the array | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
219 | * will bring this iterator to an undefined state. | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
220 | * | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
221 | * When @p remove_keeps_order is set to @c false, removing an element will only | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
222 | * move the last element to the position of the removed element, instead of | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
223 | * moving all subsequent elements by one. Usually, when the order of elements is | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
224 | * not important, this parameter should be set to @c false. | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
225 | * | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
226 | * @param array a pointer to the array (can be @c NULL) | 
| 
851
 
adb4e0737c33
issue #389 : add separate function for immutable arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
850 
diff
changeset
 | 
227 | * @param elem_size the size of one array element | 
| 
 
adb4e0737c33
issue #389 : add separate function for immutable arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
850 
diff
changeset
 | 
228 | * @param elem_count the number of elements in the array | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
229 | * @param remove_keeps_order @c true if the order of elements must be preserved | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
230 | * when removing an element | 
| 
851
 
adb4e0737c33
issue #389 : add separate function for immutable arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
850 
diff
changeset
 | 
231 | * @return an iterator for the specified array | 
| 
1070
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
232 | * @see cxIteratorPtr() | 
| 
851
 
adb4e0737c33
issue #389 : add separate function for immutable arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
850 
diff
changeset
 | 
233 | */ | 
| 
985
 
68754c7de906
major refactoring of attributes
 
Mike Becker <universe@uap-core.de> 
parents: 
933 
diff
changeset
 | 
234 | cx_attr_nodiscard | 
| 
1426
 
3a89b31f0724
clean up header files and adds support for comparing arbitrary strings with string.h functions
 
Mike Becker <universe@uap-core.de> 
parents: 
1424 
diff
changeset
 | 
235 | CX_EXPORT CxIterator cxIterator(const void *array, | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
236 | size_t elem_size, size_t elem_count, bool remove_keeps_order); | 
| 
851
 
adb4e0737c33
issue #389 : add separate function for immutable arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
850 
diff
changeset
 | 
237 | |
| 
 
adb4e0737c33
issue #389 : add separate function for immutable arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
850 
diff
changeset
 | 
238 | /** | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
239 | * Creates an iterator for the specified plain pointer array. | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
240 | * | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
241 | * This iterator assumes that every element in the array is a pointer | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
242 | * and yields exactly those pointers during iteration (on the other | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
243 | * hand, an iterator created with cxIterator() would return the | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
244 | * addresses of those pointers within the array). | 
| 
850
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
245 | * | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
246 | * While the iterator is in use, the array may only be altered by removing | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
247 | * elements through #cxIteratorFlagRemoval(). Every other change to the array | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
248 | * will bring this iterator to an undefined state. | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
249 | * | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
250 | * When @p remove_keeps_order is set to @c false, removing an element will only | 
| 
850
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
251 | * move the last element to the position of the removed element, instead of | 
| 
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
252 | * moving all subsequent elements by one. Usually, when the order of elements is | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
253 | * not important, this parameter should be set to @c false. | 
| 
850
 
b2bc48c2b251
add iterator over raw C arrays - closes #389
 
Mike Becker <universe@uap-core.de> 
parents: 
829 
diff
changeset
 | 
254 | * | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
255 | * @param array a pointer to the array (can be @c NULL) | 
| 
1070
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
256 | * @param elem_count the number of elements in the array | 
| 
1096
 
2cb1ed4da55d
refine docs for iterator.h - issue #548
 
Mike Becker <universe@uap-core.de> 
parents: 
1070 
diff
changeset
 | 
257 | * @param remove_keeps_order @c true if the order of elements must be preserved | 
| 
1070
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
258 | * when removing an element | 
| 
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
259 | * @return an iterator for the specified array | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
260 | * @see cxIterator() | 
| 
1070
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
261 | */ | 
| 
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
262 | cx_attr_nodiscard | 
| 
1429
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
263 | CX_EXPORT CxIterator cxIteratorPtr(const void *array, size_t elem_count, | 
| 
 
6e0c3a8a914a
remove the concept of "mutating iterators" - resolves #579
 
Mike Becker <universe@uap-core.de> 
parents: 
1426 
diff
changeset
 | 
264 | bool remove_keeps_order); | 
| 
1070
 
0a5a356a4486
add array iterator over pointer arrays
 
Mike Becker <universe@uap-core.de> 
parents: 
1035 
diff
changeset
 | 
265 | |
| 
933
 
40bf2f212d2a
add extern "C" to iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
890 
diff
changeset
 | 
266 | #ifdef __cplusplus | 
| 
 
40bf2f212d2a
add extern "C" to iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
890 
diff
changeset
 | 
267 | } // extern "C" | 
| 
 
40bf2f212d2a
add extern "C" to iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
890 
diff
changeset
 | 
268 | #endif | 
| 
 
40bf2f212d2a
add extern "C" to iterator.h
 
Mike Becker <universe@uap-core.de> 
parents: 
890 
diff
changeset
 | 
269 | |
| 
628
 
1e2be40f0cb5
use //-style single line comments everywhere
 
Mike Becker <universe@uap-core.de> 
parents: 
551 
diff
changeset
 | 
270 | #endif // UCX_ITERATOR_H |