From d9d35b9fb6eef13b69d54c876a3b6f1c1b629704 Mon Sep 17 00:00:00 2001 From: Mikhail Svetkin Date: Thu, 26 Jul 2018 10:42:03 +0200 Subject: Optimize implementation of Indexes generator ... which is Qt's version of std::make_index_sequence / C++14. The current Indexes generator is recursing O(N) times which is reaching recursion limits level for long IndexesList. This implementation has only O(log N) recursion. Change-Id: I423ef05152d77b18f1f5a64c49b273f49aa958bb Reviewed-by: Olivier Goffart (Woboq GmbH) Reviewed-by: Thiago Macieira --- src/corelib/kernel/qobjectdefs_impl.h | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/corelib/kernel/qobjectdefs_impl.h b/src/corelib/kernel/qobjectdefs_impl.h index a6ad00ea22..8afff1fb98 100644 --- a/src/corelib/kernel/qobjectdefs_impl.h +++ b/src/corelib/kernel/qobjectdefs_impl.h @@ -112,13 +112,31 @@ namespace QtPrivate { The Functor struct is the helper to call a functor of N argument. its call function is the same as the FunctionPointer::call function. */ - template struct IndexesList {}; - template struct IndexesAppend; - template struct IndexesAppend, Right> - { typedef IndexesList Value; }; - template struct Indexes - { typedef typename IndexesAppend::Value, N - 1>::Value Value; }; - template <> struct Indexes<0> { typedef IndexesList<> Value; }; + template using InvokeGenSeq = typename T::Type; + + template struct IndexesList { using Type = IndexesList; }; + + template struct ConcatSeqImpl; + + template + struct ConcatSeqImpl, IndexesList> + : IndexesList{}; + + template + using ConcatSeq = InvokeGenSeq>; + + template struct GenSeq; + template using makeIndexSequence = InvokeGenSeq>; + + template + struct GenSeq : ConcatSeq, makeIndexSequence>{}; + + template<> struct GenSeq<0> : IndexesList<>{}; + template<> struct GenSeq<1> : IndexesList<0>{}; + + template + struct Indexes { using Value = makeIndexSequence; }; + template struct FunctionPointer { enum {ArgumentCount = -1, IsPointerToMemberFunction = false}; }; template struct FunctorCall; -- cgit v1.2.3