From c96d8845be867664cbd69c9ba04e4640ca207a77 Mon Sep 17 00:00:00 2001 From: Hosein Ghahramanzadeh Date: Sat, 3 Aug 2019 22:47:00 +0430 Subject: [PATCH] Fix the O(n^2) instationation of the internal tuple. This change vastly improves the compilation time, and memory consumption. --- .../include/gtest/internal/gtest-internal.h | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/googletest/include/gtest/internal/gtest-internal.h b/googletest/include/gtest/internal/gtest-internal.h index ebfe3c9d..f07f58da 100644 --- a/googletest/include/gtest/internal/gtest-internal.h +++ b/googletest/include/gtest/internal/gtest-internal.h @@ -1148,30 +1148,39 @@ struct ElemFromList { static_cast(nullptr)...)); }; -template -class FlatTuple; +template +struct FlatTupleElem { + T value; + FlatTupleElem() : value() {} -template -struct FlatTupleElemBase; - -template -struct FlatTupleElemBase, I> { - using value_type = typename ElemFromList::type; - FlatTupleElemBase() = default; - explicit FlatTupleElemBase(value_type t) : value(std::move(t)) {} - value_type value; + template + explicit FlatTupleElem(Arg &&arg) : value(std::forward(arg)) {} }; -template -struct FlatTupleBase; +template +class FlatTupleBase; -template -struct FlatTupleBase, IndexSequence> - : FlatTupleElemBase, Idx>... { - using Indices = IndexSequence; - FlatTupleBase() = default; - explicit FlatTupleBase(T... t) - : FlatTupleElemBase, Idx>(std::move(t))... {} +template +class FlatTupleBase, Ts...> + : FlatTupleElem... { + public: + FlatTupleBase() {} + + template + explicit FlatTupleBase(Args&&... args) + : FlatTupleElem(std::forward(args))... {} + + template + const typename ElemFromList::type& Get() const { + return static_cast::type, I>*>(this)->value; + } + + template + typename ElemFromList::type& Get() { + return static_cast::type, + I>*>(this)->value; + } }; // Analog to std::tuple but with different tradeoffs. @@ -1183,25 +1192,16 @@ struct FlatTupleBase, IndexSequence> // regardless of T... // MakeIndexSequence, on the other hand, it is recursive but with an // instantiation depth of O(ln(N)). -template -class FlatTuple - : private FlatTupleBase, - typename MakeIndexSequence::type> { - using Indices = typename FlatTuple::FlatTupleBase::Indices; - public: - FlatTuple() = default; - explicit FlatTuple(T... t) : FlatTuple::FlatTupleBase(std::move(t)...) {} +template +struct FlatTuple + : FlatTupleBase::type, Ts...> { + FlatTuple() {} - template - const typename ElemFromList::type& Get() const { - return static_cast*>(this)->value; - } - - template - typename ElemFromList::type& Get() { - return static_cast*>(this)->value; - } + template + explicit FlatTuple(Args&&... args) + : FlatTupleBase::type, Ts...>( + std::forward(args)...){} }; // Utility functions to be called with static_assert to induce deprecation