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
223
248#define foreach(type, itervar, ...) foreach_##type(type, itervar, __VA_ARGS__)
249
250#define foreach_generic(type, itervar, ...) for (register char _foreach_outer = 1; _foreach_outer; _foreach_outer = 0) \
251 for(ForEachIterType_##type itervar = ForEachIterInit_##type; _foreach_outer; _foreach_outer = 0) \
252 for(; _foreach_outer; ForEachFinish_##type(itervar), _foreach_outer = 0) \
253 for(ForEachInit_##type(itervar, __VA_ARGS__); ForEachValid_##type(itervar); ForEachNext_##type(itervar))
254
255#define foreach_sarray(...) _foreach_array_msvc_workaround((__VA_ARGS__))
256#define _foreach_array_msvc_workaround(args) _foreach_sarray args
257#define _foreach_sarray(type, itervar, elemtype, elemvar, arrref) if ((arrref)._is_sarray) \
258 for (register char _foreach_outer = 1; _foreach_outer; _foreach_outer = 0) \
259 for (int32 itervar = 0, _##itervar##_max = saSize(arrref); _foreach_outer; _foreach_outer = 0) \
260 for (elemtype elemvar = (elemtype){0}; _foreach_outer; _foreach_outer = 0) \
261 for (itervar = 0; itervar < _##itervar##_max && (elemvar = (arrref).a[itervar], 1); ++itervar)
262
263#define foreach_hashtable foreach_generic
264#define ForEachIterType_hashtable htiter
265#define ForEachIterInit_hashtable {0}
266#define ForEachInit_hashtable(itervar, ht) htiInit(&itervar, ht)
267#define ForEachValid_hashtable(itervar) htiValid(&itervar)
268#define ForEachNext_hashtable(itervar) htiNext(&itervar)
269#define ForEachFinish_hashtable(itervar) htiFinish(&itervar)
270
271#define foreach_string foreach_generic
272#define ForEachIterType_string striter
273#define ForEachIterInit_string {0}
274#define ForEachInit_string(itervar, str) striInit(&itervar, str)
275#define ForEachValid_string(itervar) striValid(&itervar)
276#define ForEachNext_string(itervar) striNext(&itervar)
277#define ForEachFinish_string(itervar) striFinish(&itervar)
278
279#define foreach_vfssearch foreach_generic
280#define ForEachIterType_vfssearch FSSearchIter
281#define ForEachIterInit_vfssearch {0}
282#define ForEachInit_vfssearch(itervar, ...) vfsSearchInit(&itervar, __VA_ARGS__)
283#define ForEachValid_vfssearch(itervar) vfsSearchValid(&itervar)
284#define ForEachNext_vfssearch(itervar) vfsSearchNext(&itervar)
285#define ForEachFinish_vfssearch(itervar) vfsSearchFinish(&itervar)
286
287#define foreach_object(...) _foreach_object_msvc_workaround((__VA_ARGS__))
288#define _foreach_object_msvc_workaround(args) _foreach_object args
289#define _foreach_object(type, itervar, ivartype, obj) for (register char _foreach_outer = 1; _foreach_outer; _foreach_outer = 0) \
290 for(ivartype *itervar = (obj) ? (obj)->_->iter(obj) : NULL; _foreach_outer; objRelease(&itervar), _foreach_outer = 0) \
291 for(; itervar && itervar->_->valid(itervar); itervar->_->next(itervar))
292
293#define foreach_ssd(...) _foreach_ssd_msvc_workaround((__VA_ARGS__))
294#define _foreach_ssd_msvc_workaround(args) _foreach_ssd args
295#define _foreach_ssd(type, itervar, idxvar, keyvar, valvar, root) for (register char _foreach_outer = 1; _foreach_outer; _foreach_outer = 0) \
296 ssdLockedTransaction(root) \
297 for(SSDIterator *itervar = (root) ? (root)->_->_iterLocked(root, _ssdCurrentLockState) : NULL; _foreach_outer; objRelease(&itervar), _foreach_outer = 0) \
298 for(int32 idxvar = 0; _foreach_outer; _foreach_outer = 0) \
299 for(strref keyvar = 0; _foreach_outer; _foreach_outer = 0) \
300 for(stvar *valvar = 0; itervar && itervar->_->iterOut(itervar, &idxvar, &keyvar, &valvar); itervar->_->next(itervar))