Chris@102: ///////////////////////////////////////////////////////////////////////////// Chris@102: // Chris@102: // (C) Copyright Ion Gaztanaga 2014-2014 Chris@102: // Chris@102: // Distributed under the Boost Software License, Version 1.0. Chris@102: // (See accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // See http://www.boost.org/libs/intrusive for documentation. Chris@102: // Chris@102: ///////////////////////////////////////////////////////////////////////////// Chris@102: Chris@102: #ifndef BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP Chris@102: #define BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP Chris@102: Chris@102: #ifndef BOOST_CONFIG_HPP Chris@102: # include Chris@102: #endif Chris@102: Chris@102: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@102: # pragma once Chris@102: #endif Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { Chris@102: namespace intrusive { Chris@102: Chris@102: template Chris@102: class reverse_iterator Chris@102: { Chris@102: public: Chris@102: typedef typename boost::intrusive::iterator_traits::pointer pointer; Chris@102: typedef typename boost::intrusive::iterator_traits::reference reference; Chris@102: typedef typename boost::intrusive::iterator_traits::difference_type difference_type; Chris@102: typedef typename boost::intrusive::iterator_traits::iterator_category iterator_category; Chris@102: typedef typename boost::intrusive::iterator_traits::value_type value_type; Chris@102: Chris@102: Chris@102: typedef It iterator_type; Chris@102: Chris@102: reverse_iterator() Chris@102: : m_current() //Value initialization to achieve "null iterators" (N3644) Chris@102: {} Chris@102: Chris@102: explicit reverse_iterator(It r) Chris@102: : m_current(r) Chris@102: {} Chris@102: Chris@102: template Chris@102: reverse_iterator(const reverse_iterator& r) Chris@102: : m_current(r.base()) Chris@102: {} Chris@102: Chris@102: It base() const Chris@102: { return m_current; } Chris@102: Chris@102: reference operator*() const Chris@102: { It temp(m_current); --temp; return *temp; } Chris@102: Chris@102: pointer operator->() const Chris@102: { It temp(m_current); --temp; return temp.operator->(); } Chris@102: Chris@102: reference operator[](difference_type off) const Chris@102: { return this->m_current[-off-1]; } Chris@102: Chris@102: reverse_iterator& operator++() Chris@102: { --m_current; return *this; } Chris@102: Chris@102: reverse_iterator operator++(int) Chris@102: { Chris@102: reverse_iterator temp = *this; Chris@102: --m_current; Chris@102: return temp; Chris@102: } Chris@102: Chris@102: reverse_iterator& operator--() Chris@102: { Chris@102: ++m_current; Chris@102: return *this; Chris@102: } Chris@102: Chris@102: reverse_iterator operator--(int) Chris@102: { Chris@102: reverse_iterator temp(*this); Chris@102: ++m_current; Chris@102: return temp; Chris@102: } Chris@102: Chris@102: friend bool operator==(const reverse_iterator& l, const reverse_iterator& r) Chris@102: { return l.m_current == r.m_current; } Chris@102: Chris@102: friend bool operator!=(const reverse_iterator& l, const reverse_iterator& r) Chris@102: { return l.m_current != r.m_current; } Chris@102: Chris@102: friend bool operator<(const reverse_iterator& l, const reverse_iterator& r) Chris@102: { return l.m_current > r.m_current; } Chris@102: Chris@102: friend bool operator<=(const reverse_iterator& l, const reverse_iterator& r) Chris@102: { return l.m_current >= r.m_current; } Chris@102: Chris@102: friend bool operator>(const reverse_iterator& l, const reverse_iterator& r) Chris@102: { return l.m_current < r.m_current; } Chris@102: Chris@102: friend bool operator>=(const reverse_iterator& l, const reverse_iterator& r) Chris@102: { return l.m_current <= r.m_current; } Chris@102: Chris@102: reverse_iterator& operator+=(difference_type off) Chris@102: { m_current -= off; return *this; } Chris@102: Chris@102: friend reverse_iterator operator+(const reverse_iterator & l, difference_type off) Chris@102: { Chris@102: reverse_iterator tmp(l.m_current); Chris@102: tmp.m_current -= off; Chris@102: return tmp; Chris@102: } Chris@102: Chris@102: reverse_iterator& operator-=(difference_type off) Chris@102: { m_current += off; return *this; } Chris@102: Chris@102: friend reverse_iterator operator-(const reverse_iterator & l, difference_type off) Chris@102: { Chris@102: reverse_iterator tmp(l.m_current); Chris@102: tmp.m_current += off; Chris@102: return tmp; Chris@102: } Chris@102: Chris@102: friend difference_type operator-(const reverse_iterator& l, const reverse_iterator& r) Chris@102: { return r.m_current - l.m_current; } Chris@102: Chris@102: private: Chris@102: It m_current; // the wrapped iterator Chris@102: }; Chris@102: Chris@102: } //namespace intrusive { Chris@102: } //namespace boost { Chris@102: Chris@102: #include Chris@102: Chris@102: #endif //BOOST_INTRUSIVE_DETAIL_REVERSE_ITERATOR_HPP