aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2015-11-17 19:54:33 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2015-11-17 19:54:33 +0000
commit5f0b7c95485eb8e6e663d7fd8df5243192a3c7df (patch)
treee0515b6f47664e16a0c512e442d6d5a4b80fc353 /libstdc++-v3
parent490325650dbba6e7404b3fa19f078439c1434891 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--libstdc++-v3/include/std/utility19
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<>