summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkosak@google.com <kosak@google.com@8415998a-534a-0410-bf83-d39667b30386>2015-07-19 20:39:47 +0000
committerkosak@google.com <kosak@google.com@8415998a-534a-0410-bf83-d39667b30386>2015-07-19 20:39:47 +0000
commit918a81eb95666a04cae44f1dad1493dd85f12c62 (patch)
treec4df214f4a677c558d3356643676ca4dcfc4cc57
parent4c18805c3933dbf2542f92dd7e4c38cab2af8f18 (diff)
downloadgooglemock-918a81eb95666a04cae44f1dad1493dd85f12c62.tar.gz
Move Callback-related generated actions to a custom/ file.
git-svn-id: http://googlemock.googlecode.com/svn/trunk@539 8415998a-534a-0410-bf83-d39667b30386
-rw-r--r--include/gmock/gmock-generated-actions.h223
-rw-r--r--include/gmock/gmock-generated-actions.h.pump90
-rw-r--r--include/gmock/internal/custom/callback-actions.h8
-rw-r--r--include/gmock/internal/custom/callback-actions.h.pump10
-rwxr-xr-xscripts/gmock_doctor.py4
5 files changed, 166 insertions, 169 deletions
diff --git a/include/gmock/gmock-generated-actions.h b/include/gmock/gmock-generated-actions.h
index f8ffc50..f96b809 100644
--- a/include/gmock/gmock-generated-actions.h
+++ b/include/gmock/gmock-generated-actions.h
@@ -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
// subject to change without notice - DO NOT USE IN USER CODE!
#define GMOCK_FIELD_(Tuple, N) \
@@ -2181,6 +2080,7 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
namespace testing {
+
// The ACTION*() macros trigger warning C4100 (unreferenced formal
// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
// the macro definition, as the warnings are generated when the macro
@@ -2221,80 +2121,174 @@ namespace testing {
// InvokeArgument action from temporary values and have it performed
// 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,
HAS_1_TEMPLATE_PARAMS(int, k),
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));
}
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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);
}
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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);
}
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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);
}
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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);
}
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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);
}
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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);
}
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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);
}
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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);
}
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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);
}
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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);
}
@@ -2375,4 +2369,9 @@ ACTION_TEMPLATE(ReturnNew,
} // 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_
diff --git a/include/gmock/gmock-generated-actions.h.pump b/include/gmock/gmock-generated-actions.h.pump
index 9197e87..77568c3 100644
--- a/include/gmock/gmock-generated-actions.h.pump
+++ b/include/gmock/gmock-generated-actions.h.pump
@@ -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
// subject to change without notice - DO NOT USE IN USER CODE!
#define GMOCK_FIELD_(Tuple, N) \
@@ -734,6 +680,7 @@ $$ // show up in the generated code.
namespace testing {
+
// The ACTION*() macros trigger warning C4100 (unreferenced formal
// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
// the macro definition, as the warnings are generated when the macro
@@ -774,6 +721,32 @@ namespace testing {
// InvokeArgument action from temporary values and have it performed
// 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
$for i [[
$range j 0..i-1
@@ -781,7 +754,9 @@ $range j 0..i-1
ACTION_TEMPLATE(InvokeArgument,
HAS_1_TEMPLATE_PARAMS(int, k),
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]]);
}
@@ -811,4 +786,9 @@ ACTION_TEMPLATE(ReturnNew,
} // 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_
diff --git a/include/gmock/internal/custom/callback-actions.h b/include/gmock/internal/custom/callback-actions.h
new file mode 100644
index 0000000..90db304
--- /dev/null
+++ b/include/gmock/internal/custom/callback-actions.h
@@ -0,0 +1,8 @@
+// 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_
diff --git a/include/gmock/internal/custom/callback-actions.h.pump b/include/gmock/internal/custom/callback-actions.h.pump
new file mode 100644
index 0000000..df871a8
--- /dev/null
+++ b/include/gmock/internal/custom/callback-actions.h.pump
@@ -0,0 +1,10 @@
+$$ -*- 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_
diff --git a/scripts/gmock_doctor.py b/scripts/gmock_doctor.py
index c6a8a90..94e7af6 100755
--- a/scripts/gmock_doctor.py
+++ b/scripts/gmock_doctor.py
@@ -308,7 +308,7 @@ def _OverloadedFunctionActionDiagnoser(msg):
clang_regex = (_CLANG_FILE_LINE_RE + r'error: no matching '
r'function for call to \'Invoke\'\r?\n'
r'(.*\n)*?'
- r'.*\bgmock-\w+-actions\.h:\d+:\d+:\s+'
+ r'.*\bcallback-actions\.h:\d+:\d+:\s+'
r'note: candidate template ignored:\s+'
r'couldn\'t infer template argument \'FunctionImpl\'')
diagnosis = """
@@ -334,7 +334,7 @@ def _OverloadedMethodActionDiagnoser(msg):
clang_regex = (_CLANG_FILE_LINE_RE + r'error: no matching function '
r'for call to \'Invoke\'\r?\n'
r'(.*\n)*?'
- r'.*\bgmock-\w+-actions\.h:\d+:\d+: '
+ r'.*\bcallback-actions\.h:\d+:\d+: '
r'note: candidate function template not viable: '
r'requires .*, but 2 (arguments )?were provided')
diagnosis = """