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))