aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libstdc++-v3/ChangeLog13
-rw-r--r--libstdc++-v3/include/bits/cpp_type_traits.h8
-rw-r--r--libstdc++-v3/include/bits/stl_iterator_base_funcs.h18
-rw-r--r--libstdc++-v3/include/bits/stl_iterator_base_types.h24
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>