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