Inheriting std::iterator is deprecated in c++17.

Boost's iterator.hpp is deprecated, too. Therefore get rid of all of that and replace inheritance by lifting std::iterator's members into the derived class.

Signed-off-by: Daniela Engert <dani@ngrt.de>
This commit is contained in:
Daniela Engert 2017-12-27 09:20:39 +01:00
parent 218dc4baf1
commit e16f2de233
No known key found for this signature in database
GPG Key ID: 7B95EE52040C5975
4 changed files with 67 additions and 43 deletions

View File

@ -426,15 +426,16 @@ namespace detail
>::type iterator_category; >::type iterator_category;
// Needed for some broken libraries (see below) // Needed for some broken libraries (see below)
typedef boost::iterator< struct workaround_iterator_base
iterator_category {
, Value typedef typename iterator_archetype_base::iterator_category iterator_category;
, typename traversal_archetype_base< typedef Value value_type;
typedef typename traversal_archetype_base<
Value, AccessCategory, TraversalCategory Value, AccessCategory, TraversalCategory
>::difference_type >::difference_type difference_type;
, typename access::pointer typedef typename access::pointer pointer;
, typename access::reference typedef typename access::reference reference;
> workaround_iterator_base; };
}; };
} }

View File

@ -16,8 +16,13 @@ struct new_random_access
{}; {};
struct new_iterator 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; } int& operator*() const { return *m_x; }
new_iterator& operator++() { return *this; } new_iterator& operator++() { return *this; }
new_iterator operator++(int) { 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; } new_iterator operator+(std::ptrdiff_t, new_iterator x) { return x; }
struct old_iterator struct old_iterator
: public std::iterator<std::random_access_iterator_tag, int>
{ {
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; } int& operator*() const { return *m_x; }
old_iterator& operator++() { return *this; } old_iterator& operator++() { return *this; }
old_iterator operator++(int) { return *this; } old_iterator operator++(int) { return *this; }

View File

@ -5,10 +5,10 @@
#include <deque> #include <deque>
#include <iterator> #include <iterator>
#include <iostream> #include <iostream>
#include <cstddef> // std::ptrdiff_t
#include <boost/static_assert.hpp> #include <boost/static_assert.hpp>
#include <boost/noncopyable.hpp> #include <boost/noncopyable.hpp>
#include <boost/iterator/is_lvalue_iterator.hpp> #include <boost/iterator/is_lvalue_iterator.hpp>
#include <boost/iterator.hpp>
// Last, for BOOST_NO_LVALUE_RETURN_DETECTION // Last, for BOOST_NO_LVALUE_RETURN_DETECTION
#include <boost/iterator/detail/config_def.hpp> #include <boost/iterator/detail/config_def.hpp>
@ -20,29 +20,36 @@ struct v
}; };
struct value_iterator : boost::iterator<std::input_iterator_tag,v> 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; v operator*() const;
}; };
struct noncopyable_iterator : boost::iterator<std::forward_iterator_tag,boost::noncopyable> 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; boost::noncopyable const& operator*() const;
}; };
template <class T> template <class T>
struct proxy_iterator struct proxy_iterator
: boost::iterator<std::output_iterator_tag,T>
{ {
typedef T value_type; typedef T value_type;
typedef std::output_iterator_tag iterator_category;
#if BOOST_WORKAROUND(__GNUC__, == 2) typedef std::ptrdiff_t difference_type;
typedef boost::iterator<std::input_iterator_tag,value_type> base; typedef T* pointer;
typedef base::iterator_category iterator_category; typedef T& reference;
typedef base::difference_type difference_type;
typedef base::pointer pointer;
typedef base::reference reference;
#endif
struct proxy struct proxy
{ {

View File

@ -5,10 +5,10 @@
#include <deque> #include <deque>
#include <iterator> #include <iterator>
#include <iostream> #include <iostream>
#include <cstddef> // std::ptrdiff_t
#include <boost/static_assert.hpp> #include <boost/static_assert.hpp>
#include <boost/noncopyable.hpp> #include <boost/noncopyable.hpp>
#include <boost/iterator/is_readable_iterator.hpp> #include <boost/iterator/is_readable_iterator.hpp>
#include <boost/iterator.hpp>
// Last, for BOOST_NO_LVALUE_RETURN_DETECTION // Last, for BOOST_NO_LVALUE_RETURN_DETECTION
#include <boost/iterator/detail/config_def.hpp> #include <boost/iterator/detail/config_def.hpp>
@ -20,26 +20,35 @@ struct v
}; };
struct value_iterator : boost::iterator<std::input_iterator_tag,v> 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; v operator*() const;
}; };
struct noncopyable_iterator : boost::iterator<std::forward_iterator_tag,boost::noncopyable> 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; boost::noncopyable const& operator*() const;
}; };
struct proxy_iterator : boost::iterator<std::output_iterator_tag,v> struct proxy_iterator
{ {
#if BOOST_WORKAROUND(__GNUC__, == 2) typedef std::output_iterator_tag iterator_category;
typedef boost::iterator<std::input_iterator_tag,v> base; typedef v value_type;
typedef base::iterator_category iterator_category; typedef std::ptrdiff_t difference_type;
typedef base::value_type value_type; typedef v* pointer;
typedef base::difference_type difference_type; typedef v& reference;
typedef base::pointer pointer;
typedef base::reference reference;
#endif
struct proxy struct proxy
{ {
@ -50,16 +59,13 @@ struct proxy_iterator : boost::iterator<std::output_iterator_tag,v>
proxy operator*() const; proxy operator*() const;
}; };
struct proxy_iterator2 : boost::iterator<std::output_iterator_tag,v> struct proxy_iterator2
{ {
#if BOOST_WORKAROUND(__GNUC__, == 2) typedef std::output_iterator_tag iterator_category;
typedef boost::iterator<std::input_iterator_tag,v> base; typedef v value_type;
typedef base::iterator_category iterator_category; typedef std::ptrdiff_t difference_type;
typedef base::value_type value_type; typedef v* pointer;
typedef base::difference_type difference_type; typedef v& reference;
typedef base::pointer pointer;
typedef base::reference reference;
#endif
struct proxy struct proxy
{ {