PR libstdc++/66059 optimise _Build_index_tuple

PR libstdc++/66059
	* include/std/utility (_Build_index_tuple): Optimise.

From-SVN: r230496
This commit is contained in:
Jonathan Wakely 2015-11-17 19:54:33 +00:00 committed by Jonathan Wakely
parent 490325650d
commit 5f0b7c9548
2 changed files with 20 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2015-11-17 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++66059
* include/std/utility (_Build_index_tuple): Optimise.
2015-11-16 Doug Evans <dje@google.com>
PR libstdc++/67440

View File

@ -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<size_t... _Indexes>
struct _Index_tuple
template<size_t... _Indexes> struct _Index_tuple { };
// Concatenates two _Index_tuples.
template<typename _Itup1, typename _Itup2> struct _Itup_cat;
template<size_t... _Ind1, size_t... _Ind2>
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<size_t _Num>
struct _Build_index_tuple
: _Itup_cat<typename _Build_index_tuple<_Num / 2>::__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<>