51 lines
2.8 KiB
C
51 lines
2.8 KiB
C
#ifndef FOR_EACH_H
|
|
#define FOR_EACH_H
|
|
|
|
/*
|
|
* for_each - apply a function-like object (fun) to each
|
|
* following argument (a1, a2, ..., an)
|
|
* resulting in (fun(a1)), (fun(a2)), ..., (fun(an))
|
|
*
|
|
* @fun: the function-like object to apply
|
|
* @...: the list of agurments on which to apply
|
|
*
|
|
* Note: fun can be either a macro, a function or a cast
|
|
* in parenthesis (e.g. for_each((char), 67, 10))
|
|
*/
|
|
#define for_each(fun, ...) __VA_OPT__(FOR_EACH_NOT_EXPOSED__EXPAND(FOR_EACH_NOT_EXPOSED__HELPER(fun, __VA_ARGS__)))
|
|
|
|
/*
|
|
* for_each_pair - apply a function-like object (fun) to the same
|
|
* value (s) and each following argument (a1, a2, ..., an)
|
|
* resulting in (fun(s, a1)), (fun(s, a2)), ..., (fun(s, an))
|
|
*
|
|
* @fun: the function-like object to apply
|
|
* @s: the repeated first argument
|
|
* @...: the list of seconds agurments on which to apply
|
|
*
|
|
* Note: fun can be either a macro or a function
|
|
*/
|
|
#define for_each_pair(fun, s, ...) __VA_OPT__(FOR_EACH_NOT_EXPOSED__EXPAND(FOR_EACH_NOT_EXPOSED__HELPER_PAIR(fun, s, __VA_ARGS__)))
|
|
|
|
|
|
|
|
#define FOR_EACH_NOT_EXPOSED__LEFT_PAREN (
|
|
#define FOR_EACH_NOT_EXPOSED__RIGHT_PAREN )
|
|
|
|
#define FOR_EACH_NOT_EXPOSED__EXPAND(...) FOR_EACH_NOT_EXPOSED__EXPAND1(FOR_EACH_NOT_EXPOSED__EXPAND1(FOR_EACH_NOT_EXPOSED__EXPAND1(FOR_EACH_NOT_EXPOSED__EXPAND1(__VA_ARGS__))))
|
|
#define FOR_EACH_NOT_EXPOSED__EXPAND1(...) FOR_EACH_NOT_EXPOSED__EXPAND2(FOR_EACH_NOT_EXPOSED__EXPAND2(FOR_EACH_NOT_EXPOSED__EXPAND2(FOR_EACH_NOT_EXPOSED__EXPAND2(__VA_ARGS__))))
|
|
#define FOR_EACH_NOT_EXPOSED__EXPAND2(...) FOR_EACH_NOT_EXPOSED__EXPAND3(FOR_EACH_NOT_EXPOSED__EXPAND3(FOR_EACH_NOT_EXPOSED__EXPAND3(FOR_EACH_NOT_EXPOSED__EXPAND3(__VA_ARGS__))))
|
|
#define FOR_EACH_NOT_EXPOSED__EXPAND3(...) FOR_EACH_NOT_EXPOSED__EXPAND4(FOR_EACH_NOT_EXPOSED__EXPAND4(FOR_EACH_NOT_EXPOSED__EXPAND4(FOR_EACH_NOT_EXPOSED__EXPAND4(__VA_ARGS__))))
|
|
#define FOR_EACH_NOT_EXPOSED__EXPAND4(...) FOR_EACH_NOT_EXPOSED__EXPAND5(FOR_EACH_NOT_EXPOSED__EXPAND5(FOR_EACH_NOT_EXPOSED__EXPAND5(FOR_EACH_NOT_EXPOSED__EXPAND5(__VA_ARGS__))))
|
|
#define FOR_EACH_NOT_EXPOSED__EXPAND5(...) FOR_EACH_NOT_EXPOSED__EXPAND6(FOR_EACH_NOT_EXPOSED__EXPAND6(FOR_EACH_NOT_EXPOSED__EXPAND6(FOR_EACH_NOT_EXPOSED__EXPAND6(__VA_ARGS__))))
|
|
#define FOR_EACH_NOT_EXPOSED__EXPAND6(...) __VA_ARGS__
|
|
|
|
|
|
#define FOR_EACH_NOT_EXPOSED__RECURSE(helper) FOR_EACH_NOT_EXPOSED__ ## helper
|
|
#define FOR_EACH_NOT_EXPOSED__HELPER(fun, a1, ...) (fun(a1)) \
|
|
__VA_OPT__(, FOR_EACH_NOT_EXPOSED__RECURSE FOR_EACH_NOT_EXPOSED__LEFT_PAREN HELPER FOR_EACH_NOT_EXPOSED__RIGHT_PAREN(fun, __VA_ARGS__))
|
|
|
|
#define FOR_EACH_NOT_EXPOSED__HELPER_PAIR(fun, a1, a2, ...) (fun(a1, a2)) \
|
|
__VA_OPT__(, FOR_EACH_NOT_EXPOSED__RECURSE FOR_EACH_NOT_EXPOSED__LEFT_PAREN HELPER_PAIR FOR_EACH_NOT_EXPOSED__RIGHT_PAREN(fun, a1, __VA_ARGS__))
|
|
|
|
#endif //FOR_EACH_H
|