Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenlib/BLI_iterator.h
| Show All 28 Lines | typedef struct BLI_Iterator { | ||||
| void *data; /* stored data required for this iterator */ | void *data; /* stored data required for this iterator */ | ||||
| bool skip; | bool skip; | ||||
| bool valid; | bool valid; | ||||
| } BLI_Iterator; | } BLI_Iterator; | ||||
| typedef void (*IteratorCb)(BLI_Iterator *iter); | typedef void (*IteratorCb)(BLI_Iterator *iter); | ||||
| typedef void (*IteratorBeginCb)(BLI_Iterator *iter, void *data_in); | typedef void (*IteratorBeginCb)(BLI_Iterator *iter, void *data_in); | ||||
| #define BLI_ITERATOR_INIT(iter) \ | |||||
| { \ | |||||
| (iter)->skip = false; \ | |||||
| (iter)->valid = true; \ | |||||
| } \ | |||||
| ((void)0) | |||||
| #define ITER_BEGIN(callback_begin, callback_next, callback_end, _data_in, _type, _instance) \ | #define ITER_BEGIN(callback_begin, callback_next, callback_end, _data_in, _type, _instance) \ | ||||
| { \ | { \ | ||||
| _type _instance; \ | _type _instance; \ | ||||
| IteratorCb callback_end_func = callback_end; \ | IteratorCb callback_end_func = callback_end; \ | ||||
| BLI_Iterator iter_macro; \ | BLI_Iterator iter_macro; \ | ||||
| iter_macro.skip = false; \ | BLI_ITERATOR_INIT(&iter_macro); \ | ||||
| iter_macro.valid = true; \ | |||||
| for (callback_begin(&iter_macro, (_data_in)); iter_macro.valid; callback_next(&iter_macro)) { \ | for (callback_begin(&iter_macro, (_data_in)); iter_macro.valid; callback_next(&iter_macro)) { \ | ||||
| if (iter_macro.skip) { \ | if (iter_macro.skip) { \ | ||||
| iter_macro.skip = false; \ | iter_macro.skip = false; \ | ||||
| continue; \ | continue; \ | ||||
| } \ | } \ | ||||
| _instance = (_type)iter_macro.current; | _instance = (_type)iter_macro.current; | ||||
| #define ITER_END \ | #define ITER_END \ | ||||
| } \ | } \ | ||||
| callback_end_func(&iter_macro); \ | callback_end_func(&iter_macro); \ | ||||
| } \ | } \ | ||||
| ((void)0) | ((void)0) | ||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||
| } | } | ||||
| #endif | #endif | ||||