diff options
-rw-r--r-- | libstdc++-v3/ChangeLog | 13 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/cpp_type_traits.h | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_iterator_base_funcs.h | 18 | ||||
-rw-r--r-- | libstdc++-v3/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 8689151..1b66b26 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,4 +1,17 @@ 2010-09-07 Paolo Carlini <paolo.carlini@oracle.com> + Marc Glisse <marc.glisse@normalesup.org> + + 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 <paolo.carlini@oracle.com> PR libstdc++/45398 * include/std/atomic (atomic<_TP*>::store): Define. diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h index 8c5d8e9..0304946 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<typename _Tp> - 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<typename _Tp> 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 50e0bca..f885ae6 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 <ext/type_traits.h> // For __enable_if and __is_iterator - -_GLIBCXX_BEGIN_NAMESPACE(std) - template<typename _ForwardIterator> - 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<typename _BidirectionalIterator> - 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 1a85259..20fee58 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 <bits/c++config.h> +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# include <bits/cpp_type_traits.h> // 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<typename _Iterator, + bool = __has_iterator_category<_Iterator>::__value> + struct __iterator_traits { }; + + template<typename _Iterator> + 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<typename _Iterator> + struct iterator_traits + : public __iterator_traits<_Iterator> { }; +#else template<typename _Iterator> 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<typename _Tp> |