|  | /* | 
|  | * Created by William Swanson in 2012. | 
|  | * | 
|  | * I, William Swanson, dedicate this work to the public domain. | 
|  | * I waive all rights to the work worldwide under copyright law, | 
|  | * including all related and neighboring rights, | 
|  | * to the extent allowed by law. | 
|  | * | 
|  | * You can copy, modify, distribute and perform the work, | 
|  | * even for commercial purposes, all without asking permission. | 
|  | * | 
|  | * CHERIoT modifications: | 
|  | * - Added CHERIOT_ prefix to all macros to avoid namespace pollution | 
|  | * - Used pragma once instead of include guards | 
|  | */ | 
|  |  | 
|  | #pragma once | 
|  |  | 
|  | #define CHERIOT_EVAL0(...) __VA_ARGS__ | 
|  | #define CHERIOT_EVAL1(...)                                                     \ | 
|  | CHERIOT_EVAL0(CHERIOT_EVAL0(CHERIOT_EVAL0(__VA_ARGS__))) | 
|  | #define CHERIOT_EVAL2(...)                                                     \ | 
|  | CHERIOT_EVAL1(CHERIOT_EVAL1(CHERIOT_EVAL1(__VA_ARGS__))) | 
|  | #define CHERIOT_EVAL3(...)                                                     \ | 
|  | CHERIOT_EVAL2(CHERIOT_EVAL2(CHERIOT_EVAL2(__VA_ARGS__))) | 
|  | #define CHERIOT_EVAL4(...)                                                     \ | 
|  | CHERIOT_EVAL3(CHERIOT_EVAL3(CHERIOT_EVAL3(__VA_ARGS__))) | 
|  | #define CHERIOT_EVAL(...)                                                      \ | 
|  | CHERIOT_EVAL4(CHERIOT_EVAL4(CHERIOT_EVAL4(__VA_ARGS__))) | 
|  |  | 
|  | #define CHERIOT_MAP_END(...) | 
|  | #define CHERIOT_MAP_OUT | 
|  | #define CHERIOT_MAP_COMMA , | 
|  |  | 
|  | #define CHERIOT_MAP_GET_END2() 0, CHERIOT_MAP_END | 
|  | #define CHERIOT_MAP_GET_END1(...) CHERIOT_MAP_GET_END2 | 
|  | #define CHERIOT_MAP_GET_END(...) CHERIOT_MAP_GET_END1 | 
|  | #define CHERIOT_MAP_NEXT0(test, next, ...) next CHERIOT_MAP_OUT | 
|  | #define CHERIOT_MAP_NEXT1(test, next) CHERIOT_MAP_NEXT0(test, next, 0) | 
|  | #define CHERIOT_MAP_NEXT(test, next)                                           \ | 
|  | CHERIOT_MAP_NEXT1(CHERIOT_MAP_GET_END test, next) | 
|  |  | 
|  | #define CHERIOT_MAP0(f, x, peek, ...)                                          \ | 
|  | f(x) CHERIOT_MAP_NEXT(peek, CHERIOT_MAP1)(f, peek, __VA_ARGS__) | 
|  | #define CHERIOT_MAP1(f, x, peek, ...)                                          \ | 
|  | f(x) CHERIOT_MAP_NEXT(peek, CHERIOT_MAP0)(f, peek, __VA_ARGS__) | 
|  |  | 
|  | #define CHERIOT_MAP_LIST_NEXT1(test, next)                                     \ | 
|  | CHERIOT_MAP_NEXT0(test, CHERIOT_MAP_COMMA next, 0) | 
|  | #define CHERIOT_MAP_LIST_NEXT(test, next)                                      \ | 
|  | CHERIOT_MAP_LIST_NEXT1(CHERIOT_MAP_GET_END test, next) | 
|  |  | 
|  | #define CHERIOT_MAP_LIST0(f, x, peek, ...)                                     \ | 
|  | f(x) CHERIOT_MAP_LIST_NEXT(peek, CHERIOT_MAP_LIST1)(f, peek, __VA_ARGS__) | 
|  | #define CHERIOT_MAP_LIST1(f, x, peek, ...)                                     \ | 
|  | f(x) CHERIOT_MAP_LIST_NEXT(peek, CHERIOT_MAP_LIST0)(f, peek, __VA_ARGS__) | 
|  |  | 
|  | /** | 
|  | * Applies the function macro `f` to each of the remaining parameters. | 
|  | */ | 
|  | #define CHERIOT_MAP(f, ...)                                                    \ | 
|  | CHERIOT_EVAL(CHERIOT_MAP1(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) | 
|  |  | 
|  | /** | 
|  | * Applies the function macro `f` to each of the remaining parameters and | 
|  | * inserts commas between the results. | 
|  | */ | 
|  | #define CHERIOT_MAP_LIST(f, ...)                                               \ | 
|  | CHERIOT_EVAL(CHERIOT_MAP_LIST1(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) |