1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #ifndef UCX_COLLECTION_H
37 #define UCX_COLLECTION_H
38
39 #include "allocator.h"
40 #include "iterator.h"
41 #include "compare.h"
42
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47
48
49
50 #define CX_STORE_POINTERS 0
51
52
53
54
55 struct cx_collection_s {
56
57
58
59 const CxAllocator *allocator;
60
61
62
63 cx_compare_func cmpfunc;
64
65
66
67 size_t elem_size;
68
69
70
71 size_t size;
72
73
74
75
76
77
78 cx_destructor_func simple_destructor;
79
80
81
82
83
84
85 cx_destructor_func2 advanced_destructor;
86
87
88
89 void *destructor_data;
90
91
92
93
94 bool store_pointer;
95
96
97
98
99 bool sorted;
100 };
101
102
103
104
105
106
107
108
109
110
111
112
113 #define CX_COLLECTION_BASE struct cx_collection_s collection
114
115
116
117
118
119
120
121 #define cxCollectionSize(c) ((c)->collection.size)
122
123
124
125
126
127
128
129
130
131 #define cxCollectionElementSize(c) ((c)->collection.elem_size)
132
133
134
135
136
137
138
139
140 #define cxCollectionStoresPointers(c) ((c)->collection.store_pointer)
141
142
143
144
145
146
147
148
149
150
151
152
153
154 #define cxCollectionSorted(c) ((c)->collection.sorted || (c)->collection.size ==
0)
155
156
157
158
159
160
161
162 #define cxCollectionCompareFunc(c, func) (c)->collection.cmpfunc = (func)
163
164
165
166
167
168
169
170 #define cxDefineDestructor(c, destr) \
171 (c)->collection.simple_destructor = (cx_destructor_func) destr
172
173
174
175
176
177
178
179 #define cxDefineAdvancedDestructor(c, destr, data) \
180 (c)->collection.advanced_destructor = (cx_destructor_func2) destr; \
181 (c)->collection.destructor_data = data
182
183
184
185
186
187
188
189
190
191
192
193
194
195 #define cx_invoke_simple_destructor(c, e) \
196 (c)->collection.simple_destructor((c)->collection.store_pointer ? (*((
void **) (e))) : (e))
197
198
199
200
201
202
203
204
205
206
207
208
209
210 #define cx_invoke_advanced_destructor(c, e) \
211 (c)->collection.advanced_destructor((c)->collection.destructor_data, \
212 (c)->collection.store_pointer ? (*((
void **) (e))) : (e))
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227 #define cx_invoke_destructor(c, e) \
228 if ((c)->collection.simple_destructor) cx_invoke_simple_destructor(c,e); \
229 if ((c)->collection.advanced_destructor) cx_invoke_advanced_destructor(c,e)
230
231 #ifdef __cplusplus
232 }
233 #endif
234
235 #endif
236