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
67c377d3
Commit
67c377d3
authored
Jul 19, 2015
by
kosak
Browse files
Move Callback-related generated actions to a custom/ file.
parent
d86a723e
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
166 additions
and
169 deletions
+166
-169
include/gmock/gmock-generated-actions.h
include/gmock/gmock-generated-actions.h
+111
-112
include/gmock/gmock-generated-actions.h.pump
include/gmock/gmock-generated-actions.h.pump
+35
-55
include/gmock/internal/custom/callback-actions.h
include/gmock/internal/custom/callback-actions.h
+8
-0
include/gmock/internal/custom/callback-actions.h.pump
include/gmock/internal/custom/callback-actions.h.pump
+10
-0
scripts/gmock_doctor.py
scripts/gmock_doctor.py
+2
-2
No files found.
include/gmock/gmock-generated-actions.h
View file @
67c377d3
...
@@ -267,107 +267,6 @@ class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,
...
@@ -267,107 +267,6 @@ class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,
}
}
};
};
// CallableHelper has static methods for invoking "callables",
// i.e. function pointers and functors. It uses overloading to
// provide a uniform interface for invoking different kinds of
// callables. In particular, you can use:
//
// CallableHelper<R>::Call(callable, a1, a2, ..., an)
//
// to invoke an n-ary callable, where R is its return type. If an
// argument, say a2, needs to be passed by reference, you should write
// ByRef(a2) instead of a2 in the above expression.
template
<
typename
R
>
class
CallableHelper
{
public:
// Calls a nullary callable.
template
<
typename
Function
>
static
R
Call
(
Function
function
)
{
return
function
();
}
// Calls a unary callable.
// We deliberately pass a1 by value instead of const reference here
// in case it is a C-string literal. If we had declared the
// parameter as 'const A1& a1' and write Call(function, "Hi"), the
// compiler would've thought A1 is 'char[3]', which causes trouble
// when you need to copy a value of type A1. By declaring the
// parameter as 'A1 a1', the compiler will correctly infer that A1
// is 'const char*' when it sees Call(function, "Hi").
//
// Since this function is defined inline, the compiler can get rid
// of the copying of the arguments. Therefore the performance won't
// be hurt.
template
<
typename
Function
,
typename
A1
>
static
R
Call
(
Function
function
,
A1
a1
)
{
return
function
(
a1
);
}
// Calls a binary callable.
template
<
typename
Function
,
typename
A1
,
typename
A2
>
static
R
Call
(
Function
function
,
A1
a1
,
A2
a2
)
{
return
function
(
a1
,
a2
);
}
// Calls a ternary callable.
template
<
typename
Function
,
typename
A1
,
typename
A2
,
typename
A3
>
static
R
Call
(
Function
function
,
A1
a1
,
A2
a2
,
A3
a3
)
{
return
function
(
a1
,
a2
,
a3
);
}
// Calls a 4-ary callable.
template
<
typename
Function
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
>
static
R
Call
(
Function
function
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
)
{
return
function
(
a1
,
a2
,
a3
,
a4
);
}
// Calls a 5-ary callable.
template
<
typename
Function
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
>
static
R
Call
(
Function
function
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
)
{
return
function
(
a1
,
a2
,
a3
,
a4
,
a5
);
}
// Calls a 6-ary callable.
template
<
typename
Function
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
>
static
R
Call
(
Function
function
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
,
A6
a6
)
{
return
function
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
);
}
// Calls a 7-ary callable.
template
<
typename
Function
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
>
static
R
Call
(
Function
function
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
,
A6
a6
,
A7
a7
)
{
return
function
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
);
}
// Calls a 8-ary callable.
template
<
typename
Function
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
>
static
R
Call
(
Function
function
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
,
A6
a6
,
A7
a7
,
A8
a8
)
{
return
function
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
);
}
// Calls a 9-ary callable.
template
<
typename
Function
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
>
static
R
Call
(
Function
function
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
,
A6
a6
,
A7
a7
,
A8
a8
,
A9
a9
)
{
return
function
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
,
a9
);
}
// Calls a 10-ary callable.
template
<
typename
Function
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
,
typename
A10
>
static
R
Call
(
Function
function
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
,
A6
a6
,
A7
a7
,
A8
a8
,
A9
a9
,
A10
a10
)
{
return
function
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
,
a9
,
a10
);
}
};
// class CallableHelper
// An INTERNAL macro for extracting the type of a tuple field. It's
// An INTERNAL macro for extracting the type of a tuple field. It's
// subject to change without notice - DO NOT USE IN USER CODE!
// subject to change without notice - DO NOT USE IN USER CODE!
#define GMOCK_FIELD_(Tuple, N) \
#define GMOCK_FIELD_(Tuple, N) \
...
@@ -2181,6 +2080,7 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
...
@@ -2181,6 +2080,7 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
namespace
testing
{
namespace
testing
{
// The ACTION*() macros trigger warning C4100 (unreferenced formal
// The ACTION*() macros trigger warning C4100 (unreferenced formal
// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
// the macro definition, as the warnings are generated when the macro
// the macro definition, as the warnings are generated when the macro
...
@@ -2221,80 +2121,174 @@ namespace testing {
...
@@ -2221,80 +2121,174 @@ namespace testing {
// InvokeArgument action from temporary values and have it performed
// InvokeArgument action from temporary values and have it performed
// later.
// later.
namespace
internal
{
namespace
invoke_argument
{
// Appears in InvokeArgumentAdl's argument list to help avoid
// accidental calls to user functions of the same name.
struct
AdlTag
{};
// InvokeArgumentAdl - a helper for InvokeArgument.
// The basic overloads are provided here for generic functors.
// Overloads for other custom-callables are provided in the
// internal/custom/callback-actions.h header.
template
<
typename
R
,
typename
F
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
)
{
return
f
();
}
template
<
typename
R
,
typename
F
,
typename
A1
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
,
A1
a1
)
{
return
f
(
a1
);
}
template
<
typename
R
,
typename
F
,
typename
A1
,
typename
A2
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
,
A1
a1
,
A2
a2
)
{
return
f
(
a1
,
a2
);
}
template
<
typename
R
,
typename
F
,
typename
A1
,
typename
A2
,
typename
A3
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
,
A1
a1
,
A2
a2
,
A3
a3
)
{
return
f
(
a1
,
a2
,
a3
);
}
template
<
typename
R
,
typename
F
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
)
{
return
f
(
a1
,
a2
,
a3
,
a4
);
}
template
<
typename
R
,
typename
F
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
)
{
return
f
(
a1
,
a2
,
a3
,
a4
,
a5
);
}
template
<
typename
R
,
typename
F
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
,
A6
a6
)
{
return
f
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
);
}
template
<
typename
R
,
typename
F
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
,
A6
a6
,
A7
a7
)
{
return
f
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
);
}
template
<
typename
R
,
typename
F
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
,
A6
a6
,
A7
a7
,
A8
a8
)
{
return
f
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
);
}
template
<
typename
R
,
typename
F
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
,
A6
a6
,
A7
a7
,
A8
a8
,
A9
a9
)
{
return
f
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
,
a9
);
}
template
<
typename
R
,
typename
F
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
,
typename
A10
>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
,
A1
a1
,
A2
a2
,
A3
a3
,
A4
a4
,
A5
a5
,
A6
a6
,
A7
a7
,
A8
a8
,
A9
a9
,
A10
a10
)
{
return
f
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
,
a9
,
a10
);
}
}
// namespace invoke_argument
}
// namespace internal
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_0_VALUE_PARAMS
())
{
AND_0_VALUE_PARAMS
())
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
));
::
testing
::
get
<
k
>
(
args
));
}
}
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_1_VALUE_PARAMS
(
p0
))
{
AND_1_VALUE_PARAMS
(
p0
))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
),
p0
);
::
testing
::
get
<
k
>
(
args
),
p0
);
}
}
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_2_VALUE_PARAMS
(
p0
,
p1
))
{
AND_2_VALUE_PARAMS
(
p0
,
p1
))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
);
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
);
}
}
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_3_VALUE_PARAMS
(
p0
,
p1
,
p2
))
{
AND_3_VALUE_PARAMS
(
p0
,
p1
,
p2
))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
);
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
);
}
}
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_4_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
))
{
AND_4_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
);
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
);
}
}
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_5_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
))
{
AND_5_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
);
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
);
}
}
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_6_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
))
{
AND_6_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
,
p5
);
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
,
p5
);
}
}
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_7_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
))
{
AND_7_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
);
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
);
}
}
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_8_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
))
{
AND_8_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
);
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
);
}
}
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_9_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
,
p8
))
{
AND_9_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
,
p8
))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
,
p8
);
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
,
p8
);
}
}
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_10_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
,
p8
,
p9
))
{
AND_10_VALUE_PARAMS
(
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
,
p8
,
p9
))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
,
p8
,
p9
);
::
testing
::
get
<
k
>
(
args
),
p0
,
p1
,
p2
,
p3
,
p4
,
p5
,
p6
,
p7
,
p8
,
p9
);
}
}
...
@@ -2375,4 +2369,9 @@ ACTION_TEMPLATE(ReturnNew,
...
@@ -2375,4 +2369,9 @@ ACTION_TEMPLATE(ReturnNew,
}
// namespace testing
}
// namespace testing
// Include any custom callback actions added by the local installation.
// We must include this header at the end to make sure it can use the
// declarations from this file.
#include "gmock/internal/custom/callback-actions.h"
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
include/gmock/gmock-generated-actions.h.pump
View file @
67c377d3
...
@@ -80,60 +80,6 @@ class InvokeHelper<R, ::testing::tuple<$as> > {
...
@@ -80,60 +80,6 @@ class InvokeHelper<R, ::testing::tuple<$as> > {
]]
]]
// CallableHelper has static methods for invoking "callables",
// i.e. function pointers and functors. It uses overloading to
// provide a uniform interface for invoking different kinds of
// callables. In particular, you can use:
//
// CallableHelper<R>::Call(callable, a1, a2, ..., an)
//
// to invoke an n-ary callable, where R is its return type. If an
// argument, say a2, needs to be passed by reference, you should write
// ByRef(a2) instead of a2 in the above expression.
template
<
typename
R
>
class
CallableHelper
{
public:
// Calls a nullary callable.
template
<
typename
Function
>
static
R
Call
(
Function
function
)
{
return
function
();
}
// Calls a unary callable.
// We deliberately pass a1 by value instead of const reference here
// in case it is a C-string literal. If we had declared the
// parameter as 'const A1& a1' and write Call(function, "Hi"), the
// compiler would've thought A1 is 'char[3]', which causes trouble
// when you need to copy a value of type A1. By declaring the
// parameter as 'A1 a1', the compiler will correctly infer that A1
// is 'const char*' when it sees Call(function, "Hi").
//
// Since this function is defined inline, the compiler can get rid
// of the copying of the arguments. Therefore the performance won't
// be hurt.
template
<
typename
Function
,
typename
A1
>
static
R
Call
(
Function
function
,
A1
a1
)
{
return
function
(
a1
);
}
$
range
i
2.
.
n
$
for
i
[[
$
var
arity
=
[[
$
if
i
==
2
[[
binary
]]
$
elif
i
==
3
[[
ternary
]]
$
else
[[
$
i
-
ary
]]]]
// Calls a $arity callable.
$
range
j
1.
.
i
$
var
typename_As
=
[[
$
for
j
,
[[
typename
A
$
j
]]]]
$
var
Aas
=
[[
$
for
j
,
[[
A
$
j
a
$
j
]]]]
$
var
as
=
[[
$
for
j
,
[[
a
$
j
]]]]
$
var
typename_Ts
=
[[
$
for
j
,
[[
typename
T
$
j
]]]]
$
var
Ts
=
[[
$
for
j
,
[[
T
$
j
]]]]
template
<
typename
Function
,
$
typename_As
>
static
R
Call
(
Function
function
,
$
Aas
)
{
return
function
(
$
as
);
}
]]
};
// class CallableHelper
// An INTERNAL macro for extracting the type of a tuple field. It's
// An INTERNAL macro for extracting the type of a tuple field. It's
// subject to change without notice - DO NOT USE IN USER CODE!
// subject to change without notice - DO NOT USE IN USER CODE!
#define GMOCK_FIELD_(Tuple, N) \
#define GMOCK_FIELD_(Tuple, N) \
...
@@ -734,6 +680,7 @@ $$ // show up in the generated code.
...
@@ -734,6 +680,7 @@ $$ // show up in the generated code.
namespace
testing
{
namespace
testing
{
// The ACTION*() macros trigger warning C4100 (unreferenced formal
// The ACTION*() macros trigger warning C4100 (unreferenced formal
// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
// the macro definition, as the warnings are generated when the macro
// the macro definition, as the warnings are generated when the macro
...
@@ -774,6 +721,32 @@ namespace testing {
...
@@ -774,6 +721,32 @@ namespace testing {
// InvokeArgument action from temporary values and have it performed
// InvokeArgument action from temporary values and have it performed
// later.
// later.
namespace
internal
{
namespace
invoke_argument
{
// Appears in InvokeArgumentAdl's argument list to help avoid
// accidental calls to user functions of the same name.
struct
AdlTag
{};
// InvokeArgumentAdl - a helper for InvokeArgument.
// The basic overloads are provided here for generic functors.
// Overloads for other custom-callables are provided in the
// internal/custom/callback-actions.h header.
$
range
i
0.
.
n
$
for
i
[[
$
range
j
1.
.
i
template
<
typename
R
,
typename
F
[[
$
for
j
[[,
typename
A
$
j
]]]]>
R
InvokeArgumentAdl
(
AdlTag
,
F
f
[[
$
for
j
[[,
A
$
j
a
$
j
]]]])
{
return
f
([[
$
for
j
,
[[
a
$
j
]]]]);
}
]]
}
// namespace invoke_argument
}
// namespace internal
$
range
i
0.
.
n
$
range
i
0.
.
n
$
for
i
[[
$
for
i
[[
$
range
j
0.
.
i
-
1
$
range
j
0.
.
i
-
1
...
@@ -781,7 +754,9 @@ $range j 0..i-1
...
@@ -781,7 +754,9 @@ $range j 0..i-1
ACTION_TEMPLATE
(
InvokeArgument
,
ACTION_TEMPLATE
(
InvokeArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_
$
i
[[]]
_VALUE_PARAMS
(
$
for
j
,
[[
p
$
j
]]))
{
AND_
$
i
[[]]
_VALUE_PARAMS
(
$
for
j
,
[[
p
$
j
]]))
{
return
internal
::
CallableHelper
<
return_type
>::
Call
(
using
internal
::
invoke_argument
::
InvokeArgumentAdl
;
return
InvokeArgumentAdl
<
return_type
>
(
internal
::
invoke_argument
::
AdlTag
(),
::
testing
::
get
<
k
>
(
args
)
$
for
j
[[,
p
$
j
]]);
::
testing
::
get
<
k
>
(
args
)
$
for
j
[[,
p
$
j
]]);
}
}
...
@@ -811,4 +786,9 @@ ACTION_TEMPLATE(ReturnNew,
...
@@ -811,4 +786,9 @@ ACTION_TEMPLATE(ReturnNew,
}
// namespace testing
}
// namespace testing
// Include any custom callback actions added by the local installation.
// We must include this header at the end to make sure it can use the
// declarations from this file.
#include "gmock/internal/custom/callback-actions.h"
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
include/gmock/internal/custom/callback-actions.h
0 → 100644
View file @
67c377d3
// This file was GENERATED by command:
// pump.py callback-actions.h.pump
// DO NOT EDIT BY HAND!!!
#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_ACTIONS_H_
#define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_ACTIONS_H_
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_ACTIONS_H_
include/gmock/internal/custom/callback-actions.h.pump
0 → 100644
View file @
67c377d3
$$
-*-
mode
:
c
++
;
-*-
$$
This
is
a
Pump
source
file
(
http
:
//go/pump). Please use Pump to convert
$$
it
to
callback
-
actions
.
h
.
$$
$
var
max_callback_arity
=
5
$$}}
This
meta
comment
fixes
auto
-
indentation
in
editors
.
#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_ACTIONS_H_
#define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_ACTIONS_H_
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_ACTIONS_H_
scripts/gmock_doctor.py
View file @
67c377d3
...
@@ -308,7 +308,7 @@ def _OverloadedFunctionActionDiagnoser(msg):
...
@@ -308,7 +308,7 @@ def _OverloadedFunctionActionDiagnoser(msg):
clang_regex
=
(
_CLANG_FILE_LINE_RE
+
r
'error: no matching '
clang_regex
=
(
_CLANG_FILE_LINE_RE
+
r
'error: no matching '
r
'function for call to \'Invoke\'\r?\n'
r
'function for call to \'Invoke\'\r?\n'
r
'(.*\n)*?'
r
'(.*\n)*?'
r
'.*\b
gmock-\w+
-actions\.h:\d+:\d+:\s+'
r
'.*\b
callback
-actions\.h:\d+:\d+:\s+'
r
'note: candidate template ignored:\s+'
r
'note: candidate template ignored:\s+'
r
'couldn\'t infer template argument \'FunctionImpl\''
)
r
'couldn\'t infer template argument \'FunctionImpl\''
)
diagnosis
=
"""
diagnosis
=
"""
...
@@ -334,7 +334,7 @@ def _OverloadedMethodActionDiagnoser(msg):
...
@@ -334,7 +334,7 @@ def _OverloadedMethodActionDiagnoser(msg):
clang_regex
=
(
_CLANG_FILE_LINE_RE
+
r
'error: no matching function '
clang_regex
=
(
_CLANG_FILE_LINE_RE
+
r
'error: no matching function '
r
'for call to \'Invoke\'\r?\n'
r
'for call to \'Invoke\'\r?\n'
r
'(.*\n)*?'
r
'(.*\n)*?'
r
'.*\b
gmock-\w+
-actions\.h:\d+:\d+: '
r
'.*\b
callback
-actions\.h:\d+:\d+: '
r
'note: candidate function template not viable: '
r
'note: candidate function template not viable: '
r
'requires .*, but 2 (arguments )?were provided'
)
r
'requires .*, but 2 (arguments )?were provided'
)
diagnosis
=
"""
diagnosis
=
"""
...
...
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