diff options
author | ofats <ofats@google.com> | 2020-10-09 12:24:56 -0400 |
---|---|---|
committer | Derek Mauro <dmauro@google.com> | 2020-10-14 18:25:32 -0400 |
commit | 2cf1f99b97e5a50b5d9db3d5450a6b474e36b79b (patch) | |
tree | 0ebbe8266e3606d1534b0b5992aecdb49dd9f244 /googletest/include/gtest | |
parent | 0555b0eacbc56df1fd762c6aa87bb84be9e4ce7e (diff) | |
download | googletest-2cf1f99b97e5a50b5d9db3d5450a6b474e36b79b.tar.gz googletest-2cf1f99b97e5a50b5d9db3d5450a6b474e36b79b.zip |
Googletest export
Add helper methos to internal FlatTuple. Refactor constructors.
PiperOrigin-RevId: 336306681
Diffstat (limited to 'googletest/include/gtest')
-rw-r--r-- | googletest/include/gtest/internal/gtest-internal.h | 62 | ||||
-rw-r--r-- | googletest/include/gtest/internal/gtest-param-util.h | 11 |
2 files changed, 58 insertions, 15 deletions
diff --git a/googletest/include/gtest/internal/gtest-internal.h b/googletest/include/gtest/internal/gtest-internal.h index bd4e4198..08a9f9b3 100644 --- a/googletest/include/gtest/internal/gtest-internal.h +++ b/googletest/include/gtest/internal/gtest-internal.h @@ -1209,6 +1209,8 @@ struct ElemFromList { static_cast<T (*)()>(nullptr)...)); }; +struct FlatTupleConstructTag {}; + template <typename... T> class FlatTuple; @@ -1219,7 +1221,9 @@ template <typename... T, size_t I> struct FlatTupleElemBase<FlatTuple<T...>, I> { using value_type = typename ElemFromList<I, T...>::type; FlatTupleElemBase() = default; - explicit FlatTupleElemBase(value_type t) : value(std::move(t)) {} + template <typename Arg> + explicit FlatTupleElemBase(FlatTupleConstructTag, Arg&& t) + : value(std::forward<Arg>(t)) {} value_type value; }; @@ -1231,8 +1235,30 @@ struct FlatTupleBase<FlatTuple<T...>, IndexSequence<Idx...>> : FlatTupleElemBase<FlatTuple<T...>, Idx>... { using Indices = IndexSequence<Idx...>; FlatTupleBase() = default; - explicit FlatTupleBase(T... t) - : FlatTupleElemBase<FlatTuple<T...>, Idx>(std::move(t))... {} + template <typename... Args> + explicit FlatTupleBase(FlatTupleConstructTag, Args&&... args) + : FlatTupleElemBase<FlatTuple<T...>, Idx>(FlatTupleConstructTag{}, + std::forward<Args>(args))... {} + + template <size_t I> + const typename ElemFromList<I, T...>::type& Get() const { + return FlatTupleElemBase<FlatTuple<T...>, I>::value; + } + + template <size_t I> + typename ElemFromList<I, T...>::type& Get() { + return FlatTupleElemBase<FlatTuple<T...>, I>::value; + } + + template <typename F> + auto Apply(F&& f) -> decltype(std::forward<F>(f)(this->Get<Idx>()...)) { + return std::forward<F>(f)(Get<Idx>()...); + } + + template <typename F> + auto Apply(F&& f) const -> decltype(std::forward<F>(f)(this->Get<Idx>()...)) { + return std::forward<F>(f)(Get<Idx>()...); + } }; // Analog to std::tuple but with different tradeoffs. @@ -1253,17 +1279,17 @@ class FlatTuple public: FlatTuple() = default; - explicit FlatTuple(T... t) : FlatTuple::FlatTupleBase(std::move(t)...) {} - - template <size_t I> - const typename ElemFromList<I, T...>::type& Get() const { - return static_cast<const FlatTupleElemBase<FlatTuple, I>*>(this)->value; - } - - template <size_t I> - typename ElemFromList<I, T...>::type& Get() { - return static_cast<FlatTupleElemBase<FlatTuple, I>*>(this)->value; - } + template <typename... Args, + typename = typename std::enable_if< + !std::is_same<void(FlatTuple), void(typename std::decay< + Args>::type...)>::value && + (sizeof...(T) >= 1)>::type> + explicit FlatTuple(Args&&... args) + : FlatTuple::FlatTupleBase(FlatTupleConstructTag{}, + std::forward<Args>(args)...) {} + + using FlatTuple::FlatTupleBase::Apply; + using FlatTuple::FlatTupleBase::Get; }; // Utility functions to be called with static_assert to induce deprecation @@ -1296,6 +1322,14 @@ constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; } } // namespace internal } // namespace testing +namespace std { + +template <typename... Ts> +struct tuple_size<testing::internal::FlatTuple<Ts...>> + : std::integral_constant<size_t, sizeof...(Ts)> {}; + +} // namespace std + #define GTEST_MESSAGE_AT_(file, line, message, result_type) \ ::testing::internal::AssertHelper(result_type, file, line, message) \ = ::testing::Message() diff --git a/googletest/include/gtest/internal/gtest-param-util.h b/googletest/include/gtest/internal/gtest-param-util.h index f26d7d11..138d372e 100644 --- a/googletest/include/gtest/internal/gtest-param-util.h +++ b/googletest/include/gtest/internal/gtest-param-util.h @@ -783,10 +783,15 @@ internal::ParamGenerator<typename Container::value_type> ValuesIn( namespace internal { // Used in the Values() function to provide polymorphic capabilities. +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4100) +#endif + template <typename... Ts> class ValueArray { public: - ValueArray(Ts... v) : v_{std::move(v)...} {} + explicit ValueArray(Ts... v) : v_(std::move(v)...) {} template <typename T> operator ParamGenerator<T>() const { // NOLINT @@ -802,6 +807,10 @@ class ValueArray { FlatTuple<Ts...> v_; }; +#ifdef _MSC_VER +#pragma warning(pop) +#endif + template <typename... T> class CartesianProductGenerator : public ParamGeneratorInterface<::std::tuple<T...>> { |