Skip to content

Commit ec72ee5

Browse files
authored
Extend macros num range (#51)
* Extend macros num range Signed-off-by: jparisu <javierparis@eprosima.com> * uncrustify Signed-off-by: jparisu <javierparis@eprosima.com> --------- Signed-off-by: jparisu <javierparis@eprosima.com>
1 parent 7f7289a commit ec72ee5

1 file changed

Lines changed: 28 additions & 18 deletions

File tree

cpp_utils/include/cpp_utils/macros/recursive_macros.hpp

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,36 +30,37 @@ namespace utils {
3030
/////////////////////////
3131

3232
/**
33-
* @brief Get 11th macro.
33+
* @brief Get 20th macro.
3434
*
3535
* @note This macro is used in \c COUNT_ARGUMENT macro.
3636
*/
37-
#define _ELEVENTH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, ...) \
38-
a11
37+
#define _TWENTIETH_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
38+
...) \
39+
a20
3940

4041
/**
41-
* @brief Count number of arguments in a variadic macro with maximum 9 variables
42+
* @brief Count number of arguments in a variadic macro with maximum 18 variables
4243
*
4344
* @note This is an auxiliary macro that encapsulates the funtionality of \c COUNT_ARGUMENTS so that macro
4445
* could be changed to a higher value without breaking API.
4546
*
4647
* @note \c dummy value is required to non argument calls.
4748
*/
48-
#define _COUNT_ARGUMENTS__UP_TO_NINE(...) \
49-
_ELEVENTH_ARGUMENT(dummy, ## __VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
49+
#define _COUNT_ARGUMENTS__UP_TO_EIGHTEEN(...) \
50+
_TWENTIETH_ARGUMENT(dummy, ## __VA_ARGS__, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
5051

5152
/**
5253
* @brief Count number of arguments in a variadic macro
5354
*
54-
* @warning This macro only allows up to 9 values.
55+
* @warning This macro only allows up to 18 values.
5556
*
56-
* @note if more arguments required, change \c _ELEVENTH_ARGUMENT for a higher one.
57+
* @note if more arguments required, change \c _TWENTIETH_ARGUMENT for a higher one.
5758
*
5859
* @example
5960
* COUNT_ARGUMENTS(el1, el2, el3) = 3
6061
*/
6162
#define COUNT_ARGUMENTS(...) \
62-
_COUNT_ARGUMENTS__UP_TO_NINE(__VA_ARGS__)
63+
_COUNT_ARGUMENTS__UP_TO_EIGHTEEN(__VA_ARGS__)
6364

6465

6566
/////////////////////////
@@ -80,33 +81,42 @@ namespace utils {
8081
#define _FE_7(ACTION, X, ...) ACTION(X) _FE_6(ACTION, __VA_ARGS__)
8182
#define _FE_8(ACTION, X, ...) ACTION(X) _FE_7(ACTION, __VA_ARGS__)
8283
#define _FE_9(ACTION, X, ...) ACTION(X) _FE_8(ACTION, __VA_ARGS__)
84+
#define _FE_10(ACTION, X, ...) ACTION(X) _FE_9(ACTION, __VA_ARGS__)
85+
#define _FE_11(ACTION, X, ...) ACTION(X) _FE_10(ACTION, __VA_ARGS__)
86+
#define _FE_12(ACTION, X, ...) ACTION(X) _FE_11(ACTION, __VA_ARGS__)
87+
#define _FE_13(ACTION, X, ...) ACTION(X) _FE_12(ACTION, __VA_ARGS__)
88+
#define _FE_14(ACTION, X, ...) ACTION(X) _FE_13(ACTION, __VA_ARGS__)
89+
#define _FE_15(ACTION, X, ...) ACTION(X) _FE_14(ACTION, __VA_ARGS__)
90+
#define _FE_16(ACTION, X, ...) ACTION(X) _FE_15(ACTION, __VA_ARGS__)
91+
#define _FE_17(ACTION, X, ...) ACTION(X) _FE_16(ACTION, __VA_ARGS__)
92+
#define _FE_18(ACTION, X, ...) ACTION(X) _FE_17(ACTION, __VA_ARGS__)
8393
//... repeat as needed
8494

8595
/**
86-
* @brief Get the 9th argument
96+
* @brief Get the 18th argument
8797
*
8898
* @note this is useful for \c APPLY_MACRO_FOR_EACH macro.
8999
*/
90-
#define _GET_NINTH_ARGUMENT(_1, _2, _3, _4, _5, _6, _7, _8, _9, NAME, ...) \
100+
#define _GET_EIGHTEENTH_ARGUMENT(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, NAME, \
101+
...) \
91102
NAME
92103

93-
#define _APPLY_MACRO_FOR_EACH__UP_TO_NINE(action, ...) \
94-
_GET_NINTH_ARGUMENT(__VA_ARGS__, _FE_9, _FE_8, _FE_7, _FE_6, _FE_5, _FE_4, _FE_3, _FE_2, _FE_1)(action, __VA_ARGS__)
104+
#define _APPLY_MACRO_FOR_EACH__UP_TO_EIGHTEEN(action, ...) \
105+
_GET_EIGHTEENTH_ARGUMENT(__VA_ARGS__, _FE_18, _FE_17, _FE_16, _FE_15, _FE_14, _FE_13, _FE_12, _FE_11, _FE_10, _FE_9, \
106+
_FE_8, _FE_7, _FE_6, _FE_5, _FE_4, _FE_3, _FE_2, _FE_1)(action, __VA_ARGS__)
95107

96108
/**
97109
* @brief Execute \c action (must be a macro) for every argument after it.
98110
*
99-
* @warning This macro only allows up to 9 values.
111+
* @warning This macro only allows up to 18 values.
100112
*
101-
* @note if more arguments required, change \c _APPLY_MACRO_FOR_EACH__UP_TO_NINE for a higher one.
113+
* @note if more arguments required, change \c _APPLY_MACRO_FOR_EACH__UP_TO_EIGHTEEN for a higher one.
102114
*
103115
* @example
104116
* APPLY_MACRO_FOR_EACH(print, el1, el2, el3) => print(el1); print(el2); print(el3);
105117
*/
106118
#define APPLY_MACRO_FOR_EACH(action, ...) \
107-
_APPLY_MACRO_FOR_EACH__UP_TO_NINE(action, __VA_ARGS__)
119+
_APPLY_MACRO_FOR_EACH__UP_TO_EIGHTEEN(action, __VA_ARGS__)
108120

109121
} /* namespace utils */
110122
} /* namespace eprosima */
111-
112-

0 commit comments

Comments
 (0)