From 5f0b7c95485eb8e6e663d7fd8df5243192a3c7df Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Tue, 17 Nov 2015 19:54:33 +0000 Subject: [PATCH] PR libstdc++/66059 optimise _Build_index_tuple PR libstdc++/66059 * include/std/utility (_Build_index_tuple): Optimise. From-SVN: r230496 --- libstdc++-v3/ChangeLog | 5 +++++ libstdc++-v3/include/std/utility | 19 +++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9ef08908c01..d865255ece2 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2015-11-17 Jonathan Wakely + + PR libstdc++66059 + * include/std/utility (_Build_index_tuple): Optimise. + 2015-11-16 Doug Evans PR libstdc++/67440 diff --git a/libstdc++-v3/include/std/utility b/libstdc++-v3/include/std/utility index 89b68522ddf..985bcb20215 100644 --- a/libstdc++-v3/include/std/utility +++ b/libstdc++-v3/include/std/utility @@ -212,17 +212,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Stores a tuple of indices. Used by tuple and pair, and by bind() to // extract the elements in a tuple. - template - struct _Index_tuple + template struct _Index_tuple { }; + + // Concatenates two _Index_tuples. + template struct _Itup_cat; + + template + struct _Itup_cat<_Index_tuple<_Ind1...>, _Index_tuple<_Ind2...>> { - typedef _Index_tuple<_Indexes..., sizeof...(_Indexes)> __next; + using __type = _Index_tuple<_Ind1..., (_Ind2 + sizeof...(_Ind1))...>; }; // Builds an _Index_tuple<0, 1, 2, ..., _Num-1>. template struct _Build_index_tuple + : _Itup_cat::__type, + typename _Build_index_tuple<_Num - _Num / 2>::__type> + { }; + + template<> + struct _Build_index_tuple<1> { - typedef typename _Build_index_tuple<_Num - 1>::__type::__next __type; + typedef _Index_tuple<0> __type; }; template<> -- 2.30.2