CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
foreach.h
Go to the documentation of this file.
1
#pragma once
2
3
#include <cx/utils/macros.h>
4
7
8
// element zero-initializer for foreach_sarray since C++ can't use compound literals
9
#ifndef __cplusplus
10
#define _cx_foreach_zeroinit(elemtype) (elemtype) { 0 }
11
#else
12
#define _cx_foreach_zeroinit(elemtype) \
13
{ }
14
#endif
15
231
256
#define foreach(type, itervar, ...) foreach_##type(type, itervar, __VA_ARGS__)
257
258
#define foreach_generic(type, itervar, ...) \
259
for (_cx_keyword_register char _foreach_outer = 1; _foreach_outer; _foreach_outer = 0) \
260
for (ForEachIterType_##type itervar = ForEachIterInit_##type; _foreach_outer; \
261
_foreach_outer = 0) \
262
for (; _foreach_outer; ForEachFinish_##type(itervar), _foreach_outer = 0) \
263
for (ForEachInit_##type(itervar, __VA_ARGS__); ForEachValid_##type(itervar); \
264
ForEachNext_##type(itervar))
265
266
#define foreach_sarray(...) _foreach_array_msvc_workaround((__VA_ARGS__))
267
#define _foreach_array_msvc_workaround(args) _foreach_sarray args
268
#define _foreach_sarray(type, itervar, elemtype, elemvar, arrref) \
269
if ((arrref)._is_sarray) \
270
for (_cx_keyword_register char _foreach_outer = 1; _foreach_outer; _foreach_outer = 0) \
271
for (int32 itervar = 0, _##itervar##_max = saSize(arrref); _foreach_outer; \
272
_foreach_outer = 0) \
273
for (elemtype elemvar = _cx_foreach_zeroinit(elemtype); _foreach_outer; \
274
_foreach_outer = 0) \
275
for (itervar = 0; \
276
itervar < _##itervar##_max && (elemvar = (arrref).a[itervar], 1); \
277
++itervar)
278
279
#define foreach_hashtable foreach_generic
280
#define ForEachIterType_hashtable htiter
281
#define ForEachIterInit_hashtable { 0 }
282
#define ForEachInit_hashtable(itervar, ht) htiInit(&itervar, ht)
283
#define ForEachValid_hashtable(itervar) htiValid(&itervar)
284
#define ForEachNext_hashtable(itervar) htiNext(&itervar)
285
#define ForEachFinish_hashtable(itervar) htiFinish(&itervar)
286
287
#define foreach_string foreach_generic
288
#define ForEachIterType_string striter
289
#define ForEachIterInit_string { 0 }
290
#define ForEachInit_string(itervar, str) striInit(&itervar, str)
291
#define ForEachValid_string(itervar) striValid(&itervar)
292
#define ForEachNext_string(itervar) striNext(&itervar)
293
#define ForEachFinish_string(itervar) striFinish(&itervar)
294
295
#define foreach_vfssearch foreach_generic
296
#define ForEachIterType_vfssearch FSSearchIter
297
#define ForEachIterInit_vfssearch { 0 }
298
#define ForEachInit_vfssearch(itervar, ...) vfsSearchInit(&itervar, __VA_ARGS__)
299
#define ForEachValid_vfssearch(itervar) vfsSearchValid(&itervar)
300
#define ForEachNext_vfssearch(itervar) vfsSearchNext(&itervar)
301
#define ForEachFinish_vfssearch(itervar) vfsSearchFinish(&itervar)
302
303
#define foreach_object(...) _foreach_object_msvc_workaround((__VA_ARGS__))
304
#define _foreach_object_msvc_workaround(args) _foreach_object args
305
#define _foreach_object(type, itervar, ivartype, obj) \
306
for (_cx_keyword_register char _foreach_outer = 1; _foreach_outer; _foreach_outer = 0) \
307
for (ivartype* itervar = (obj) ? (obj)->_->iter(obj) : NULL; _foreach_outer; \
308
objRelease(&itervar), _foreach_outer = 0) \
309
for (; itervar && itervar->_->valid(itervar); itervar->_->next(itervar))
310
311
#define foreach_ssd(...) _foreach_ssd_msvc_workaround((__VA_ARGS__))
312
#define _foreach_ssd_msvc_workaround(args) _foreach_ssd args
313
#define _foreach_ssd(type, itervar, idxvar, keyvar, valvar, root) \
314
for (_cx_keyword_register char _foreach_outer = 1; _foreach_outer; _foreach_outer = 0) \
315
ssdLockedTransaction(root) for ( \
316
SSDIterator* itervar = (root) ? (root)->_->_iterLocked(root, _ssdCurrentLockState) : NULL; \
317
_foreach_outer; \
318
objRelease(&itervar), \
319
_foreach_outer = \
320
0) for (int32 idxvar = 0; _foreach_outer; \
321
_foreach_outer = 0) for (strref keyvar = 0; _foreach_outer; \
322
_foreach_outer = 0) for (stvar* valvar = 0; \
323
itervar && \
324
itervar->_ \
325
->iterOut(itervar, \
326
&idxvar, \
327
&keyvar, \
328
&valvar); \
329
itervar->_->next(itervar))
cx
container
foreach.h
Generated by
1.9.8