diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2015-11-17 19:54:33 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2015-11-17 19:54:33 +0000 |
commit | 5f0b7c95485eb8e6e663d7fd8df5243192a3c7df (patch) | |
tree | e0515b6f47664e16a0c512e442d6d5a4b80fc353 /libstdc++-v3 | |
parent | 490325650dbba6e7404b3fa19f078439c1434891 (diff) | |
download | gcc-5f0b7c95485eb8e6e663d7fd8df5243192a3c7df.zip gcc-5f0b7c95485eb8e6e663d7fd8df5243192a3c7df.tar.gz gcc-5f0b7c95485eb8e6e663d7fd8df5243192a3c7df.tar.bz2 |
PR libstdc++/66059 optimise _Build_index_tuple
PR libstdc++/66059
* include/std/utility (_Build_index_tuple): Optimise.
From-SVN: r230496
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/std/utility | 19 |
2 files changed, 20 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9ef0890..d865255 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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 diff --git a/libstdc++-v3/include/std/utility b/libstdc++-v3/include/std/utility index 89b6852..985bcb2 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<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<> |