Googletest export
Use C++11 variadic templates for ActionHelper in gmock-generated-actions.h. Make ActionHelper use variadic templates to generate Perform static member function specializations instead of using pump.py syntax. PiperOrigin-RevId: 284988441
This commit is contained in:
parent
d442089d53
commit
d8eeb9760a
@ -1184,6 +1184,46 @@ inline ::std::reference_wrapper<T> ByRef(T& l_value) { // NOLINT
|
|||||||
return ::std::reference_wrapper<T>(l_value);
|
return ::std::reference_wrapper<T>(l_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
// A macro from the ACTION* family (defined later in gmock-generated-actions.h)
|
||||||
|
// defines an action that can be used in a mock function. Typically,
|
||||||
|
// these actions only care about a subset of the arguments of the mock
|
||||||
|
// function. For example, if such an action only uses the second
|
||||||
|
// argument, it can be used in any mock function that takes >= 2
|
||||||
|
// arguments where the type of the second argument is compatible.
|
||||||
|
//
|
||||||
|
// Therefore, the action implementation must be prepared to take more
|
||||||
|
// arguments than it needs. The ExcessiveArg type is used to
|
||||||
|
// represent those excessive arguments. In order to keep the compiler
|
||||||
|
// error messages tractable, we define it in the testing namespace
|
||||||
|
// instead of testing::internal. However, this is an INTERNAL TYPE
|
||||||
|
// and subject to change without notice, so a user MUST NOT USE THIS
|
||||||
|
// TYPE DIRECTLY.
|
||||||
|
struct ExcessiveArg {};
|
||||||
|
|
||||||
|
// A helper class needed for implementing the ACTION* macros.
|
||||||
|
template <typename Result, class Impl>
|
||||||
|
class ActionHelper {
|
||||||
|
public:
|
||||||
|
template <typename... Ts>
|
||||||
|
static Result Perform(Impl* impl, const std::tuple<Ts...>& args) {
|
||||||
|
return Apply(impl, args, MakeIndexSequence<sizeof...(Ts)>{},
|
||||||
|
MakeIndexSequence<10 - sizeof...(Ts)>{});
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <typename... Ts, std::size_t... tuple_ids, std::size_t... rest_ids>
|
||||||
|
static Result Apply(Impl* impl, const std::tuple<Ts...>& args,
|
||||||
|
IndexSequence<tuple_ids...>, IndexSequence<rest_ids...>) {
|
||||||
|
return impl->template gmock_PerformImpl<Ts...>(
|
||||||
|
args, std::get<tuple_ids>(args)...,
|
||||||
|
((void)rest_ids, ExcessiveArg())...);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
@ -47,133 +47,6 @@
|
|||||||
#include "gmock/gmock-actions.h"
|
#include "gmock/gmock-actions.h"
|
||||||
#include "gmock/internal/gmock-port.h"
|
#include "gmock/internal/gmock-port.h"
|
||||||
|
|
||||||
namespace testing {
|
|
||||||
namespace internal {
|
|
||||||
|
|
||||||
// A macro from the ACTION* family (defined later in this file)
|
|
||||||
// defines an action that can be used in a mock function. Typically,
|
|
||||||
// these actions only care about a subset of the arguments of the mock
|
|
||||||
// function. For example, if such an action only uses the second
|
|
||||||
// argument, it can be used in any mock function that takes >= 2
|
|
||||||
// arguments where the type of the second argument is compatible.
|
|
||||||
//
|
|
||||||
// Therefore, the action implementation must be prepared to take more
|
|
||||||
// arguments than it needs. The ExcessiveArg type is used to
|
|
||||||
// represent those excessive arguments. In order to keep the compiler
|
|
||||||
// error messages tractable, we define it in the testing namespace
|
|
||||||
// instead of testing::internal. However, this is an INTERNAL TYPE
|
|
||||||
// and subject to change without notice, so a user MUST NOT USE THIS
|
|
||||||
// TYPE DIRECTLY.
|
|
||||||
struct ExcessiveArg {};
|
|
||||||
|
|
||||||
// A helper class needed for implementing the ACTION* macros.
|
|
||||||
template <typename Result, class Impl>
|
|
||||||
class ActionHelper {
|
|
||||||
public:
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<>(args, ExcessiveArg(),
|
|
||||||
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
|
|
||||||
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
|
|
||||||
ExcessiveArg());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename A0>
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<A0>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<A0>(args, std::get<0>(args),
|
|
||||||
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
|
|
||||||
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
|
|
||||||
ExcessiveArg());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename A0, typename A1>
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<A0, A1>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<A0, A1>(args, std::get<0>(args),
|
|
||||||
std::get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
|
|
||||||
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
|
|
||||||
ExcessiveArg());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename A0, typename A1, typename A2>
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<A0, A1, A2>(args,
|
|
||||||
std::get<0>(args), std::get<1>(args), std::get<2>(args),
|
|
||||||
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
|
|
||||||
ExcessiveArg(), ExcessiveArg(), ExcessiveArg());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename A0, typename A1, typename A2, typename A3>
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args,
|
|
||||||
std::get<0>(args), std::get<1>(args), std::get<2>(args),
|
|
||||||
std::get<3>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
|
|
||||||
ExcessiveArg(), ExcessiveArg(), ExcessiveArg());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename A0, typename A1, typename A2, typename A3, typename A4>
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3,
|
|
||||||
A4>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args,
|
|
||||||
std::get<0>(args), std::get<1>(args), std::get<2>(args),
|
|
||||||
std::get<3>(args), std::get<4>(args), ExcessiveArg(), ExcessiveArg(),
|
|
||||||
ExcessiveArg(), ExcessiveArg(), ExcessiveArg());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename A0, typename A1, typename A2, typename A3, typename A4,
|
|
||||||
typename A5>
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4,
|
|
||||||
A5>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args,
|
|
||||||
std::get<0>(args), std::get<1>(args), std::get<2>(args),
|
|
||||||
std::get<3>(args), std::get<4>(args), std::get<5>(args),
|
|
||||||
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename A0, typename A1, typename A2, typename A3, typename A4,
|
|
||||||
typename A5, typename A6>
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,
|
|
||||||
A6>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args,
|
|
||||||
std::get<0>(args), std::get<1>(args), std::get<2>(args),
|
|
||||||
std::get<3>(args), std::get<4>(args), std::get<5>(args),
|
|
||||||
std::get<6>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename A0, typename A1, typename A2, typename A3, typename A4,
|
|
||||||
typename A5, typename A6, typename A7>
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,
|
|
||||||
A6, A7>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6,
|
|
||||||
A7>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args),
|
|
||||||
std::get<3>(args), std::get<4>(args), std::get<5>(args),
|
|
||||||
std::get<6>(args), std::get<7>(args), ExcessiveArg(), ExcessiveArg());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename A0, typename A1, typename A2, typename A3, typename A4,
|
|
||||||
typename A5, typename A6, typename A7, typename A8>
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,
|
|
||||||
A6, A7, A8>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7,
|
|
||||||
A8>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args),
|
|
||||||
std::get<3>(args), std::get<4>(args), std::get<5>(args),
|
|
||||||
std::get<6>(args), std::get<7>(args), std::get<8>(args),
|
|
||||||
ExcessiveArg());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename A0, typename A1, typename A2, typename A3, typename A4,
|
|
||||||
typename A5, typename A6, typename A7, typename A8, typename A9>
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,
|
|
||||||
A6, A7, A8, A9>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8,
|
|
||||||
A9>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args),
|
|
||||||
std::get<3>(args), std::get<4>(args), std::get<5>(args),
|
|
||||||
std::get<6>(args), std::get<7>(args), std::get<8>(args),
|
|
||||||
std::get<9>(args));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace internal
|
|
||||||
} // namespace testing
|
|
||||||
|
|
||||||
// The ACTION* family of macros can be used in a namespace scope to
|
// The ACTION* family of macros can be used in a namespace scope to
|
||||||
// define custom actions easily. The syntax:
|
// define custom actions easily. The syntax:
|
||||||
//
|
//
|
||||||
|
@ -49,54 +49,6 @@ $$}} This meta comment fixes auto-indentation in editors.
|
|||||||
#include "gmock/gmock-actions.h"
|
#include "gmock/gmock-actions.h"
|
||||||
#include "gmock/internal/gmock-port.h"
|
#include "gmock/internal/gmock-port.h"
|
||||||
|
|
||||||
namespace testing {
|
|
||||||
namespace internal {
|
|
||||||
|
|
||||||
// A macro from the ACTION* family (defined later in this file)
|
|
||||||
// defines an action that can be used in a mock function. Typically,
|
|
||||||
// these actions only care about a subset of the arguments of the mock
|
|
||||||
// function. For example, if such an action only uses the second
|
|
||||||
// argument, it can be used in any mock function that takes >= 2
|
|
||||||
// arguments where the type of the second argument is compatible.
|
|
||||||
//
|
|
||||||
// Therefore, the action implementation must be prepared to take more
|
|
||||||
// arguments than it needs. The ExcessiveArg type is used to
|
|
||||||
// represent those excessive arguments. In order to keep the compiler
|
|
||||||
// error messages tractable, we define it in the testing namespace
|
|
||||||
// instead of testing::internal. However, this is an INTERNAL TYPE
|
|
||||||
// and subject to change without notice, so a user MUST NOT USE THIS
|
|
||||||
// TYPE DIRECTLY.
|
|
||||||
struct ExcessiveArg {};
|
|
||||||
|
|
||||||
// A helper class needed for implementing the ACTION* macros.
|
|
||||||
template <typename Result, class Impl>
|
|
||||||
class ActionHelper {
|
|
||||||
public:
|
|
||||||
$range i 0..n
|
|
||||||
$for i
|
|
||||||
|
|
||||||
[[
|
|
||||||
$var template = [[$if i==0 [[]] $else [[
|
|
||||||
$range j 0..i-1
|
|
||||||
template <$for j, [[typename A$j]]>
|
|
||||||
]]]]
|
|
||||||
$range j 0..i-1
|
|
||||||
$var As = [[$for j, [[A$j]]]]
|
|
||||||
$var as = [[$for j, [[std::get<$j>(args)]]]]
|
|
||||||
$range k 1..n-i
|
|
||||||
$var eas = [[$for k, [[ExcessiveArg()]]]]
|
|
||||||
$var arg_list = [[$if (i==0) | (i==n) [[$as$eas]] $else [[$as, $eas]]]]
|
|
||||||
$template
|
|
||||||
static Result Perform(Impl* impl, const ::std::tuple<$As>& args) {
|
|
||||||
return impl->template gmock_PerformImpl<$As>(args, $arg_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
]]
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace internal
|
|
||||||
} // namespace testing
|
|
||||||
|
|
||||||
// The ACTION* family of macros can be used in a namespace scope to
|
// The ACTION* family of macros can be used in a namespace scope to
|
||||||
// define custom actions easily. The syntax:
|
// define custom actions easily. The syntax:
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user