// | |
// 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 |