diff --git a/include/boost/iterator/iterator_archetypes.hpp b/include/boost/iterator/iterator_archetypes.hpp index 9b4b543..1d25915 100644 --- a/include/boost/iterator/iterator_archetypes.hpp +++ b/include/boost/iterator/iterator_archetypes.hpp @@ -426,15 +426,16 @@ namespace detail >::type iterator_category; // Needed for some broken libraries (see below) - typedef boost::iterator< - iterator_category - , Value - , typename traversal_archetype_base< + struct workaround_iterator_base + { + typedef typename iterator_archetype_base::iterator_category iterator_category; + typedef Value value_type; + typedef typename traversal_archetype_base< Value, AccessCategory, TraversalCategory - >::difference_type - , typename access::pointer - , typename access::reference - > workaround_iterator_base; + >::difference_type difference_type; + typedef typename access::pointer pointer; + typedef typename access::reference reference; + }; }; } diff --git a/test/concept_tests.cpp b/test/concept_tests.cpp index f89cd54..5fb6a78 100644 --- a/test/concept_tests.cpp +++ b/test/concept_tests.cpp @@ -16,8 +16,13 @@ struct new_random_access {}; struct new_iterator - : public std::iterator< new_random_access, int > { + typedef new_random_access iterator_category; + typedef int value_type; + typedef std::ptrdiff_t difference_type; + typedef int* pointer; + typedef int& reference; + int& operator*() const { return *m_x; } new_iterator& operator++() { return *this; } new_iterator operator++(int) { return *this; } @@ -36,8 +41,13 @@ struct new_iterator new_iterator operator+(std::ptrdiff_t, new_iterator x) { return x; } struct old_iterator - : public std::iterator { + typedef std::random_access_iterator_tag iterator_category; + typedef int value_type; + typedef std::ptrdiff_t difference_type; + typedef int* pointer; + typedef int& reference; + int& operator*() const { return *m_x; } old_iterator& operator++() { return *this; } old_iterator operator++(int) { return *this; } diff --git a/test/is_lvalue_iterator.cpp b/test/is_lvalue_iterator.cpp index a3f7b6f..3871032 100644 --- a/test/is_lvalue_iterator.cpp +++ b/test/is_lvalue_iterator.cpp @@ -5,10 +5,10 @@ #include #include #include +#include // std::ptrdiff_t #include #include #include -#include // Last, for BOOST_NO_LVALUE_RETURN_DETECTION #include @@ -20,29 +20,36 @@ struct v }; -struct value_iterator : boost::iterator +struct value_iterator { + typedef std::input_iterator_tag iterator_category; + typedef v value_type; + typedef std::ptrdiff_t difference_type; + typedef v* pointer; + typedef v& reference; + v operator*() const; }; -struct noncopyable_iterator : boost::iterator +struct noncopyable_iterator { + typedef std::forward_iterator_tag iterator_category; + typedef boost::noncopyable value_type; + typedef std::ptrdiff_t difference_type; + typedef boost::noncopyable* pointer; + typedef boost::noncopyable& reference; + boost::noncopyable const& operator*() const; }; template struct proxy_iterator - : boost::iterator { typedef T value_type; - -#if BOOST_WORKAROUND(__GNUC__, == 2) - typedef boost::iterator base; - typedef base::iterator_category iterator_category; - typedef base::difference_type difference_type; - typedef base::pointer pointer; - typedef base::reference reference; -#endif + typedef std::output_iterator_tag iterator_category; + typedef std::ptrdiff_t difference_type; + typedef T* pointer; + typedef T& reference; struct proxy { diff --git a/test/is_readable_iterator.cpp b/test/is_readable_iterator.cpp index ee58089..c663697 100644 --- a/test/is_readable_iterator.cpp +++ b/test/is_readable_iterator.cpp @@ -5,10 +5,10 @@ #include #include #include +#include // std::ptrdiff_t #include #include #include -#include // Last, for BOOST_NO_LVALUE_RETURN_DETECTION #include @@ -20,26 +20,35 @@ struct v }; -struct value_iterator : boost::iterator +struct value_iterator { + typedef std::input_iterator_tag iterator_category; + typedef v value_type; + typedef std::ptrdiff_t difference_type; + typedef v* pointer; + typedef v& reference; + v operator*() const; }; -struct noncopyable_iterator : boost::iterator +struct noncopyable_iterator { + typedef std::forward_iterator_tag iterator_category; + typedef boost::noncopyable value_type; + typedef std::ptrdiff_t difference_type; + typedef boost::noncopyable* pointer; + typedef boost::noncopyable& reference; + boost::noncopyable const& operator*() const; }; -struct proxy_iterator : boost::iterator +struct proxy_iterator { -#if BOOST_WORKAROUND(__GNUC__, == 2) - typedef boost::iterator base; - typedef base::iterator_category iterator_category; - typedef base::value_type value_type; - typedef base::difference_type difference_type; - typedef base::pointer pointer; - typedef base::reference reference; -#endif + typedef std::output_iterator_tag iterator_category; + typedef v value_type; + typedef std::ptrdiff_t difference_type; + typedef v* pointer; + typedef v& reference; struct proxy { @@ -50,16 +59,13 @@ struct proxy_iterator : boost::iterator proxy operator*() const; }; -struct proxy_iterator2 : boost::iterator +struct proxy_iterator2 { -#if BOOST_WORKAROUND(__GNUC__, == 2) - typedef boost::iterator base; - typedef base::iterator_category iterator_category; - typedef base::value_type value_type; - typedef base::difference_type difference_type; - typedef base::pointer pointer; - typedef base::reference reference; -#endif + typedef std::output_iterator_tag iterator_category; + typedef v value_type; + typedef std::ptrdiff_t difference_type; + typedef v* pointer; + typedef v& reference; struct proxy {