mirror of
https://github.com/google/googletest.git
synced 2025-01-14 00:20:57 +08:00
Accept move-only callables in InvokeArguments
PiperOrigin-RevId: 594223533 Change-Id: I491fae7d851d4e0df07fb3627416949071fec8d6
This commit is contained in:
parent
96eadf659f
commit
dddb219c3e
@ -606,7 +606,7 @@ struct InvokeArgumentAction {
|
|||||||
internal::FlatTuple<Args &&...> args_tuple(FlatTupleConstructTag{},
|
internal::FlatTuple<Args &&...> args_tuple(FlatTupleConstructTag{},
|
||||||
std::forward<Args>(args)...);
|
std::forward<Args>(args)...);
|
||||||
return params.Apply([&](const Params &...unpacked_params) {
|
return params.Apply([&](const Params &...unpacked_params) {
|
||||||
auto &&callable = args_tuple.template Get<index>();
|
auto &&callable = std::move(args_tuple.template Get<index>());
|
||||||
return internal::InvokeArgument(
|
return internal::InvokeArgument(
|
||||||
std::forward<decltype(callable)>(callable), unpacked_params...);
|
std::forward<decltype(callable)>(callable), unpacked_params...);
|
||||||
});
|
});
|
||||||
|
@ -85,6 +85,12 @@ struct UnaryFunctor {
|
|||||||
int operator()(bool x) { return x ? 1 : -1; }
|
int operator()(bool x) { return x ? 1 : -1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct UnaryMoveOnlyFunctor : UnaryFunctor {
|
||||||
|
UnaryMoveOnlyFunctor() = default;
|
||||||
|
UnaryMoveOnlyFunctor(const UnaryMoveOnlyFunctor&) = delete;
|
||||||
|
UnaryMoveOnlyFunctor(UnaryMoveOnlyFunctor&&) = default;
|
||||||
|
};
|
||||||
|
|
||||||
const char* Binary(const char* input, short n) { return input + n; } // NOLINT
|
const char* Binary(const char* input, short n) { return input + n; } // NOLINT
|
||||||
|
|
||||||
int Ternary(int x, char y, short z) { return x + y + z; } // NOLINT
|
int Ternary(int x, char y, short z) { return x + y + z; } // NOLINT
|
||||||
@ -698,12 +704,18 @@ TEST(InvokeArgumentTest, Function0) {
|
|||||||
EXPECT_EQ(1, a.Perform(std::make_tuple(2, &Nullary)));
|
EXPECT_EQ(1, a.Perform(std::make_tuple(2, &Nullary)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests using InvokeArgument with a unary function.
|
// Tests using InvokeArgument with a unary functor.
|
||||||
TEST(InvokeArgumentTest, Functor1) {
|
TEST(InvokeArgumentTest, Functor1) {
|
||||||
Action<int(UnaryFunctor)> a = InvokeArgument<0>(true); // NOLINT
|
Action<int(UnaryFunctor)> a = InvokeArgument<0>(true); // NOLINT
|
||||||
EXPECT_EQ(1, a.Perform(std::make_tuple(UnaryFunctor())));
|
EXPECT_EQ(1, a.Perform(std::make_tuple(UnaryFunctor())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests using InvokeArgument with a unary move-only functor.
|
||||||
|
TEST(InvokeArgumentTest, Functor1MoveOnly) {
|
||||||
|
Action<int(UnaryMoveOnlyFunctor)> a = InvokeArgument<0>(true); // NOLINT
|
||||||
|
EXPECT_EQ(1, a.Perform(std::make_tuple(UnaryMoveOnlyFunctor())));
|
||||||
|
}
|
||||||
|
|
||||||
// Tests using InvokeArgument with a 5-ary function.
|
// Tests using InvokeArgument with a 5-ary function.
|
||||||
TEST(InvokeArgumentTest, Function5) {
|
TEST(InvokeArgumentTest, Function5) {
|
||||||
Action<int(int (*)(int, int, int, int, int))> a = // NOLINT
|
Action<int(int (*)(int, int, int, int, int))> a = // NOLINT
|
||||||
|
Loading…
x
Reference in New Issue
Block a user