From ccef29e83119a42c412fbc9608a1f11ee165db5f Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 7 Sep 2010 22:30:33 +0000 Subject: [PATCH] re PR libstdc++/45549 (merge is_iterator into iterator_traits) 2010-09-07 Paolo Carlini Marc Glisse PR libstdc++/45549 * include/bits/cpp_type_traits.h (__is_iterator_helper): Rename to __has_iterator_category. (__is_iterator): Adjust. * include/bits/stl_iterator_base_types.h (__iterator_traits): Add in C++0x mode, use the latter. (iterator_traits): In C++0x mode, derive from the latter. * include/bits/stl_iterator_base_funcs.h (next, prev): Remove enable_if on the return type. Co-Authored-By: Marc Glisse From-SVN: r163977 --- libstdc++-v3/ChangeLog | 13 ++++++++++ libstdc++-v3/include/bits/cpp_type_traits.h | 8 +++---- .../include/bits/stl_iterator_base_funcs.h | 18 ++++---------- .../include/bits/stl_iterator_base_types.h | 24 +++++++++++++++++++ 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 86891510adf..1b66b26b326 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2010-09-07 Paolo Carlini + Marc Glisse + + PR libstdc++/45549 + * include/bits/cpp_type_traits.h (__is_iterator_helper): Rename to + __has_iterator_category. + (__is_iterator): Adjust. + * include/bits/stl_iterator_base_types.h (__iterator_traits): Add + in C++0x mode, use the latter. + (iterator_traits): In C++0x mode, derive from the latter. + * include/bits/stl_iterator_base_funcs.h (next, prev): Remove + enable_if on the return type. + 2010-09-07 Paolo Carlini PR libstdc++/45398 diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h index 8c5d8e9ca27..030494665a0 100644 --- a/libstdc++-v3/include/bits/cpp_type_traits.h +++ b/libstdc++-v3/include/bits/cpp_type_traits.h @@ -415,7 +415,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) #endif template - class __is_iterator_helper + class __has_iterator_category { typedef char __one; typedef struct { char __arr[2]; } __two; @@ -431,14 +431,14 @@ _GLIBCXX_BEGIN_NAMESPACE(std) static __two __test(...); public: - static const bool __value = (sizeof(__test<_Tp>(0)) == 1 - || __is_pointer<_Tp>::__value); + static const bool __value = sizeof(__test<_Tp>(0)) == 1; }; template struct __is_iterator { - enum { __value = __is_iterator_helper<_Tp>::__value }; + enum { __value = (__has_iterator_category<_Tp>::__value + || __is_pointer<_Tp>::__value) }; typedef typename __truth_type<__value>::__type __type; }; diff --git a/libstdc++-v3/include/bits/stl_iterator_base_funcs.h b/libstdc++-v3/include/bits/stl_iterator_base_funcs.h index 50e0bca83e2..f885ae63f71 100644 --- a/libstdc++-v3/include/bits/stl_iterator_base_funcs.h +++ b/libstdc++-v3/include/bits/stl_iterator_base_funcs.h @@ -173,18 +173,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) std::__advance(__i, __d, std::__iterator_category(__i)); } -_GLIBCXX_END_NAMESPACE - #ifdef __GXX_EXPERIMENTAL_CXX0X__ -#include // For __enable_if and __is_iterator - -_GLIBCXX_BEGIN_NAMESPACE(std) - template - inline typename - __gnu_cxx::__enable_if<__is_iterator<_ForwardIterator>::__value, - _ForwardIterator>::__type + inline _ForwardIterator next(_ForwardIterator __x, typename iterator_traits<_ForwardIterator>::difference_type __n = 1) { @@ -193,9 +185,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } template - inline typename - __gnu_cxx::__enable_if<__is_iterator<_BidirectionalIterator>::__value, - _BidirectionalIterator>::__type + inline _BidirectionalIterator prev(_BidirectionalIterator __x, typename iterator_traits<_BidirectionalIterator>::difference_type __n = 1) { @@ -203,8 +193,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) return __x; } -_GLIBCXX_END_NAMESPACE - #endif // __GXX_EXPERIMENTAL_CXX0X__ +_GLIBCXX_END_NAMESPACE + #endif /* _STL_ITERATOR_BASE_FUNCS_H */ diff --git a/libstdc++-v3/include/bits/stl_iterator_base_types.h b/libstdc++-v3/include/bits/stl_iterator_base_types.h index 1a852591345..20fee58a0a8 100644 --- a/libstdc++-v3/include/bits/stl_iterator_base_types.h +++ b/libstdc++-v3/include/bits/stl_iterator_base_types.h @@ -64,6 +64,10 @@ #include +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# include // For __has_iterator_category +#endif + _GLIBCXX_BEGIN_NAMESPACE(std) /** @@ -132,6 +136,25 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * argument. Specialized versions for pointers and pointers-to-const * provide tighter, more correct semantics. */ +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template::__value> + struct __iterator_traits { }; + + template + struct __iterator_traits<_Iterator, true> + { + typedef typename _Iterator::iterator_category iterator_category; + typedef typename _Iterator::value_type value_type; + typedef typename _Iterator::difference_type difference_type; + typedef typename _Iterator::pointer pointer; + typedef typename _Iterator::reference reference; + }; + + template + struct iterator_traits + : public __iterator_traits<_Iterator> { }; +#else template struct iterator_traits { @@ -141,6 +164,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) typedef typename _Iterator::pointer pointer; typedef typename _Iterator::reference reference; }; +#endif /// Partial specialization for pointer types. template