From cc72371b837dbfa5d2eb35ccc1cf75d826fc9259 Mon Sep 17 00:00:00 2001 From: paolo Date: Thu, 8 Nov 2007 14:40:33 +0000 Subject: [PATCH] 2007-11-08 Paolo Carlini * include/std/type_traits (__decay_selector<_Up, false, false>): Change according to DR 705. * include/bits/stl_pair.h (make_pair(_T1&&, _T2&&)): Change according to DR 706. * include/tr1_impl/tuple: Tweak. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130001 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 8 +++++ libstdc++-v3/include/bits/stl_pair.h | 40 +++++++++++++++++++--- libstdc++-v3/include/std/type_traits | 6 ++-- libstdc++-v3/include/tr1_impl/tuple | 8 +++-- .../20_util/decay/requirements/typedefs.cc | 3 +- 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 282323c0d96..0dc8222b7cf 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,13 @@ 2007-11-08 Paolo Carlini + * include/std/type_traits (__decay_selector<_Up, false, false>): + Change according to DR 705. + * include/bits/stl_pair.h (make_pair(_T1&&, _T2&&)): Change + according to DR 706. + * include/tr1_impl/tuple: Tweak. + +2007-11-08 Paolo Carlini + * include/debug/vector (push_back, emplace): Fix signature typo. 2007-11-08 Paolo Carlini diff --git a/libstdc++-v3/include/bits/stl_pair.h b/libstdc++-v3/include/bits/stl_pair.h index 7163b62205f..66230261077 100644 --- a/libstdc++-v3/include/bits/stl_pair.h +++ b/libstdc++-v3/include/bits/stl_pair.h @@ -211,14 +211,44 @@ _GLIBCXX_BEGIN_NAMESPACE(std) make_pair(_T1 __x, _T2 __y) { return pair<_T1, _T2>(__x, __y); } #else + template + class reference_wrapper; + + // Helper which adds a reference to a type when given a reference_wrapper + template + struct __strip_reference_wrapper + { + typedef _Tp __type; + }; + + template + struct __strip_reference_wrapper > + { + typedef _Tp& __type; + }; + + template + struct __strip_reference_wrapper > + { + typedef _Tp& __type; + }; + + template + struct __decay_and_strip + { + typedef typename __strip_reference_wrapper< + typename decay<_Tp>::type>::__type __type; + }; + + // NB: DR 706. template - inline pair::type, - typename std::decay<_T2>::type> + inline pair::__type, + typename __decay_and_strip<_T2>::__type> make_pair(_T1&& __x, _T2&& __y) { - return pair::type, - typename std::decay<_T2>::type>(std::forward<_T1>(__x), - std::forward<_T2>(__y)); + return pair::__type, + typename __decay_and_strip<_T2>::__type> + (std::forward<_T1>(__x), std::forward<_T2>(__y)); } #endif diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 33442ba5a31..38c92abf6e8 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -308,21 +308,21 @@ namespace std bool _IsFunction = is_function<_Up>::value> struct __decay_selector; + // NB: DR 705. template struct __decay_selector<_Up, false, false> - { typedef _Up __type; }; + { typedef typename remove_cv<_Up>::type __type; }; template struct __decay_selector<_Up, true, false> { typedef typename remove_extent<_Up>::type* __type; }; - template struct __decay_selector<_Up, false, true> { typedef typename add_pointer<_Up>::type __type; }; template - struct decay + struct decay { private: typedef typename remove_reference<_Tp>::type __remove_type; diff --git a/libstdc++-v3/include/tr1_impl/tuple b/libstdc++-v3/include/tr1_impl/tuple index 52017d617c1..e71bd4174c2 100644 --- a/libstdc++-v3/include/tr1_impl/tuple +++ b/libstdc++-v3/include/tr1_impl/tuple @@ -39,9 +39,6 @@ namespace std { _GLIBCXX_BEGIN_NAMESPACE_TR1 - template - class reference_wrapper; - // Adds a const reference to a non-reference type. template struct __add_c_ref @@ -375,6 +372,10 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 const tuple<_UElements...>& __u) { return !(__t < __u); } +#ifdef _GLIBCXX_INCLUDE_AS_TR1 + template + class reference_wrapper; + // Helper which adds a reference to a type when given a reference_wrapper template struct __strip_reference_wrapper @@ -393,6 +394,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 { typedef _Tp& __type; }; +#endif template inline tuple::__type...> diff --git a/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs.cc index 162ddd2ff42..30b98d518e0 100644 --- a/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs.cc +++ b/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs.cc @@ -34,8 +34,9 @@ void test01() typedef decay::type test1_type; VERIFY( (is_same::value) ); + // NB: DR 705. typedef decay::type test2_type; - VERIFY( (is_same::value) ); + VERIFY( (is_same::value) ); typedef decay::type test3_type; VERIFY( (is_same::type*>::value) ); -- 2.11.0