Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
e1b67b07
Commit
e1b67b07
authored
Oct 11, 2019
by
Joshua Cannon
Browse files
Avoid recursive macros
parent
3e813465
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
28 additions
and
22 deletions
+28
-22
googlemock/include/gmock/internal/gmock-pp.h
googlemock/include/gmock/internal/gmock-pp.h
+28
-22
No files found.
googlemock/include/gmock/internal/gmock-pp.h
View file @
e1b67b07
...
@@ -27,29 +27,28 @@
...
@@ -27,29 +27,28 @@
//
//
// Requires: the number of arguments after expansion is at most 15.
// Requires: the number of arguments after expansion is at most 15.
#define GMOCK_PP_NARG(...) \
#define GMOCK_PP_NARG(...) \
GMOCK_PP_INTERNAL_
INTERNAL_
16TH( \
GMOCK_PP_INTERNAL_16TH(
\
__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
(
__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
)
// Returns 1 if the expansion of arguments has an unprotected comma. Otherwise
// Returns 1 if the expansion of arguments has an unprotected comma. Otherwise
// returns 0. Requires no more than 15 unprotected commas.
// returns 0. Requires no more than 15 unprotected commas.
#define GMOCK_PP_HAS_COMMA(...) \
#define GMOCK_PP_HAS_COMMA(...) \
GMOCK_PP_INTERNAL_EXPAND_WITH( \
GMOCK_PP_INTERNAL_16TH( \
GMOCK_PP_INTERNAL_INTERNAL_16TH, \
(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0))
(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0))
// Returns the first argument.
// Returns the first argument.
#define GMOCK_PP_HEAD(...) \
#define GMOCK_PP_HEAD(...) \
GMOCK_PP_INTERNAL_
EXPAND_WITH(GMOCK_PP_INTERNAL_HEAD,
(__VA_ARGS__))
GMOCK_PP_INTERNAL_
HEAD(
(__VA_ARGS__))
// Returns the tail. A variadic list of all arguments minus the first. Requires
// Returns the tail. A variadic list of all arguments minus the first. Requires
// at least one argument.
// at least one argument.
#define GMOCK_PP_TAIL(...) \
#define GMOCK_PP_TAIL(...) \
GMOCK_PP_INTERNAL_EXPAND_WITH(
GMOCK_PP_INTERNAL_TAIL
,
(__VA_ARGS__))
GMOCK_PP_INTERNAL_TAIL
(
(__VA_ARGS__))
// Calls CAT(_Macro, NARG(__VA_ARGS__))(__VA_ARGS__)
// Calls CAT(_Macro, NARG(__VA_ARGS__))(__VA_ARGS__)
#define GMOCK_PP_VARIADIC_CALL(_Macro, ...) \
#define GMOCK_PP_VARIADIC_CALL(_Macro, ...) \
GMOCK_PP_I
NTERNAL_VARIADIC_CALL(
\
GMOCK_PP_I
DENTITY(
\
_Macro, GMOCK_PP_NARG(__VA_ARGS__)
,
__VA_ARGS__)
GMOCK_PP_CAT(
_Macro,
GMOCK_PP_NARG(__VA_ARGS__)
)(
__VA_ARGS__)
)
// If the arguments after expansion have no tokens, evaluates to `1`. Otherwise
// If the arguments after expansion have no tokens, evaluates to `1`. Otherwise
// evaluates to `0`.
// evaluates to `0`.
...
@@ -147,10 +146,6 @@
...
@@ -147,10 +146,6 @@
#define GMOCK_PP_INTENRAL_EMPTY_TUPLE (, , , , , , , , , , , , , , , )
#define GMOCK_PP_INTENRAL_EMPTY_TUPLE (, , , , , , , , , , , , , , , )
#define GMOCK_PP_INTERNAL_CAT(_1, _2) _1##_2
#define GMOCK_PP_INTERNAL_CAT(_1, _2) _1##_2
#define GMOCK_PP_INTERNAL_STRINGIZE(...) #__VA_ARGS__
#define GMOCK_PP_INTERNAL_STRINGIZE(...) #__VA_ARGS__
#define GMOCK_PP_INTERNAL_INTERNAL_16TH(_1, _2, _3, _4, _5, _6, _7, _8, _9, \
_10, _11, _12, _13, _14, _15, _16, \
...) \
_16
#define GMOCK_PP_INTERNAL_CAT_5(_1, _2, _3, _4, _5) _1##_2##_3##_4##_5
#define GMOCK_PP_INTERNAL_CAT_5(_1, _2, _3, _4, _5) _1##_2##_3##_4##_5
#define GMOCK_PP_INTERNAL_IS_EMPTY(_1, _2, _3, _4) \
#define GMOCK_PP_INTERNAL_IS_EMPTY(_1, _2, _3, _4) \
GMOCK_PP_HAS_COMMA(GMOCK_PP_INTERNAL_CAT_5(GMOCK_PP_INTERNAL_IS_EMPTY_CASE_, \
GMOCK_PP_HAS_COMMA(GMOCK_PP_INTERNAL_CAT_5(GMOCK_PP_INTERNAL_IS_EMPTY_CASE_, \
...
@@ -158,13 +153,24 @@
...
@@ -158,13 +153,24 @@
#define GMOCK_PP_INTERNAL_IS_EMPTY_CASE_0001 ,
#define GMOCK_PP_INTERNAL_IS_EMPTY_CASE_0001 ,
#define GMOCK_PP_INTERNAL_IF_1(_Then, _Else) _Then
#define GMOCK_PP_INTERNAL_IF_1(_Then, _Else) _Then
#define GMOCK_PP_INTERNAL_IF_0(_Then, _Else) _Else
#define GMOCK_PP_INTERNAL_IF_0(_Then, _Else) _Else
#define GMOCK_PP_INTERNAL_HEAD(_1, ...) _1
#define GMOCK_PP_INTERNAL_TAIL(_1, ...) __VA_ARGS__
// Because of MSVC treating a token with a comma in it as a single token when passed
// Workaround MSVC behavior of treating __VA_ARGS__ with commas as one arg
// to another macro, we need to force it to evaluate it as multiple tokens. We do that
// _Args must be wrapped in parenthesis
// by using a "IDENTITY(MACRO PARENTHESIZED_ARGS)" macro.
#define GMOCK_PP_INTERNAL_EXPAND_WITH(_Macro, _Args) _Macro _Args
// We define one per possible macro that relies on this behavior.
#define GMOCK_PP_INTERNAL_VARIADIC_CALL(_Macro, _N, ...) \
// Note "_Args" must be parenthesized.
GMOCK_PP_INTERNAL_EXPAND_WITH(GMOCK_PP_CAT(_Macro, _N),(__VA_ARGS__))
#define GMOCK_PP_INTERNAL_INTERNAL_16TH(_1, _2, _3, _4, _5, _6, _7, _8, _9, \
_10, _11, _12, _13, _14, _15, _16, \
...) \
_16
#define GMOCK_PP_INTERNAL_16TH(_Args) \
GMOCK_PP_IDENTITY(GMOCK_PP_INTERNAL_INTERNAL_16TH _Args)
#define GMOCK_PP_INTERNAL_INTERNAL_HEAD(_1, ...) _1
#define GMOCK_PP_INTERNAL_HEAD(_Args) \
GMOCK_PP_IDENTITY(GMOCK_PP_INTERNAL_INTERNAL_HEAD _Args)
#define GMOCK_PP_INTERNAL_INTERNAL_TAIL(_1, ...) __VA_ARGS__
#define GMOCK_PP_INTERNAL_TAIL(_Args) \
GMOCK_PP_IDENTITY(GMOCK_PP_INTERNAL_INTERNAL_TAIL _Args)
#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C(...) 1 _
#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C(...) 1 _
#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_1 1,
#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_1 1,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment