| // |
| // Boost.Pointer Container |
| // |
| // Copyright Thorsten Ottosen 2003-2005. Use, modification and |
| // distribution is subject to 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) |
| // |
| // For more information, see http://www.boost.org/libs/ptr_container/ |
| // |
| |
| #ifndef BOOST_PTR_CONTAINER_DETAIL_VOID_PTR_ITERATOR_HPP |
| #define BOOST_PTR_CONTAINER_DETAIL_VOID_PTR_ITERATOR_HPP |
| |
| #if defined(_MSC_VER) && (_MSC_VER >= 1200) |
| # pragma once |
| #endif |
| |
| #include <boost/config.hpp> |
| #include <boost/iterator/iterator_traits.hpp> |
| #include <boost/type_traits/remove_const.hpp> |
| |
| namespace boost |
| { |
| template |
| < |
| class VoidIter, |
| class T |
| > |
| class void_ptr_iterator |
| { |
| public: |
| typedef BOOST_DEDUCED_TYPENAME boost::remove_const<T>::type |
| value_type; |
| typedef T& reference; |
| typedef T* pointer; |
| |
| typedef BOOST_DEDUCED_TYPENAME iterator_difference<VoidIter>::type |
| difference_type; |
| typedef BOOST_DEDUCED_TYPENAME iterator_category<VoidIter>::type |
| iterator_category; |
| private: |
| |
| VoidIter iter_; |
| |
| public: |
| void_ptr_iterator() : iter_() |
| { } |
| |
| void_ptr_iterator( VoidIter r ) : iter_(r) |
| { } |
| |
| // |
| // Remark: passing by value breaks vc7.1 |
| // |
| template< class MutableIterator, class MutableT > |
| void_ptr_iterator( const void_ptr_iterator<MutableIterator,MutableT>& r ) |
| #ifdef BOOST_NO_SFINAE |
| : iter_( VoidIter(const_cast<void**>(&*r.base())) ) |
| #else |
| |
| : iter_(r.base()) |
| #endif |
| { } |
| |
| T& operator*() const |
| { |
| return *static_cast<T*>( *iter_ ); |
| } |
| |
| T* operator->() const |
| { |
| return static_cast<T*>( *iter_ ); |
| } |
| |
| void_ptr_iterator& operator++() |
| { |
| ++iter_; |
| return *this; |
| } |
| |
| void_ptr_iterator operator++(int) |
| { |
| void_ptr_iterator res = *this; |
| ++iter_; |
| return res; |
| } |
| |
| void_ptr_iterator& operator--() |
| { |
| --iter_; |
| return *this; |
| } |
| |
| void_ptr_iterator operator--(int) |
| { |
| void_ptr_iterator res = *this; |
| --iter_; |
| return res; |
| } |
| |
| void_ptr_iterator& operator+=( difference_type n ) |
| { |
| iter_ += n; |
| return *this; |
| } |
| |
| void_ptr_iterator& operator-=( difference_type n ) |
| { |
| iter_ -= n; |
| return *this; |
| } |
| |
| T& operator[]( difference_type n ) const |
| { |
| return *static_cast<T*>( *(iter_ + n) ); |
| } |
| |
| VoidIter base() const |
| { |
| return iter_; |
| } |
| |
| }; // class 'void_ptr_iterator' |
| |
| template< class VoidIter, class T > |
| inline void_ptr_iterator<VoidIter,T> |
| operator+( void_ptr_iterator<VoidIter,T> l, |
| BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type n ) |
| { |
| l += n; |
| return l; |
| } |
| |
| template< class VoidIter, class T > |
| inline void_ptr_iterator<VoidIter,T> |
| operator+( BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type n, |
| void_ptr_iterator<VoidIter,T> r ) |
| |
| { |
| r += n; |
| return r; |
| } |
| |
| template< class VoidIter, class T > |
| inline void_ptr_iterator<VoidIter,T> |
| operator-( void_ptr_iterator<VoidIter,T> l, |
| BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type n ) |
| { |
| l -= n; |
| return l; |
| } |
| |
| template< class VoidIter, class T > |
| inline void_ptr_iterator<VoidIter,T> |
| operator-( BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type n, |
| void_ptr_iterator<VoidIter,T> r ) |
| |
| { |
| r -= n; |
| return r; |
| } |
| |
| template< class VoidIter, class T, class VoidIterU, class U > |
| inline BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type |
| operator-( void_ptr_iterator<VoidIter,T> l, |
| void_ptr_iterator<VoidIterU,U> r ) |
| |
| { |
| return l.base() - r.base(); |
| } |
| |
| |
| |
| template< class VoidIterT, class T, class VoidIterU, class U > |
| inline bool operator==( const void_ptr_iterator<VoidIterT,T>& l, |
| const void_ptr_iterator<VoidIterU,U>& r ) |
| { |
| return l.base() == r.base(); |
| } |
| |
| |
| |
| template< class VoidIterT, class T, class VoidIterU, class U > |
| inline bool operator!=( const void_ptr_iterator<VoidIterT,T>& l, |
| const void_ptr_iterator<VoidIterU,U>& r ) |
| { |
| return l.base() != r.base(); |
| } |
| |
| |
| |
| template< class VoidIterT, class T, class VoidIterU, class U > |
| inline bool operator<( const void_ptr_iterator<VoidIterT,T>& l, |
| const void_ptr_iterator<VoidIterU,U>& r ) |
| { |
| return l.base() < r.base(); |
| } |
| |
| |
| |
| template< class VoidIterT, class T, class VoidIterU, class U > |
| inline bool operator<=( const void_ptr_iterator<VoidIterT,T>& l, |
| const void_ptr_iterator<VoidIterU,U>& r ) |
| { |
| return l.base() <= r.base(); |
| } |
| |
| |
| |
| template< class VoidIterT, class T, class VoidIterU, class U > |
| inline bool operator>( const void_ptr_iterator<VoidIterT,T>& l, |
| const void_ptr_iterator<VoidIterU,U>& r ) |
| { |
| return l.base() > r.base(); |
| } |
| |
| |
| |
| template< class VoidIterT, class T, class VoidIterU, class U > |
| inline bool operator>=( const void_ptr_iterator<VoidIterT,T>& l, |
| const void_ptr_iterator<VoidIterU,U>& r ) |
| { |
| return l.base() >= r.base(); |
| } |
| |
| } |
| |
| #endif |