diff options
Diffstat (limited to 'boost/ptr_container/detail/void_ptr_iterator.hpp')
-rw-r--r--[-rwxr-xr-x] | boost/ptr_container/detail/void_ptr_iterator.hpp | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/boost/ptr_container/detail/void_ptr_iterator.hpp b/boost/ptr_container/detail/void_ptr_iterator.hpp index 937ffb4aa2..5a96eb4719 100755..100644 --- a/boost/ptr_container/detail/void_ptr_iterator.hpp +++ b/boost/ptr_container/detail/void_ptr_iterator.hpp @@ -161,8 +161,22 @@ namespace boost return r; } + + namespace ptr_container_detail + { + template<typename T, typename U> + struct is_compatible + { + static const bool value = boost::is_same< typename boost::remove_const<T>::type, typename boost::remove_const<U>::type >::value; + }; + } + + template< class VoidIter, class T, class VoidIterU, class U > - inline BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type + inline BOOST_DEDUCED_TYPENAME boost::enable_if< + ptr_container_detail::is_compatible<T, U>, + BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type + >::type operator-( void_ptr_iterator<VoidIter,T> l, void_ptr_iterator<VoidIterU,U> r ) @@ -173,7 +187,11 @@ namespace boost template< class VoidIterT, class T, class VoidIterU, class U > - inline bool operator==( const void_ptr_iterator<VoidIterT,T>& l, + inline BOOST_DEDUCED_TYPENAME boost::enable_if< + ptr_container_detail::is_compatible<T, U>, + bool + >::type + operator==( const void_ptr_iterator<VoidIterT,T>& l, const void_ptr_iterator<VoidIterU,U>& r ) { return l.base() == r.base(); @@ -182,7 +200,11 @@ namespace boost template< class VoidIterT, class T, class VoidIterU, class U > - inline bool operator!=( const void_ptr_iterator<VoidIterT,T>& l, + inline BOOST_DEDUCED_TYPENAME boost::enable_if< + ptr_container_detail::is_compatible<T, U>, + bool + >::type + operator!=( const void_ptr_iterator<VoidIterT,T>& l, const void_ptr_iterator<VoidIterU,U>& r ) { return l.base() != r.base(); @@ -191,7 +213,11 @@ namespace boost template< class VoidIterT, class T, class VoidIterU, class U > - inline bool operator<( const void_ptr_iterator<VoidIterT,T>& l, + inline BOOST_DEDUCED_TYPENAME boost::enable_if< + ptr_container_detail::is_compatible<T, U>, + bool + >::type + operator<( const void_ptr_iterator<VoidIterT,T>& l, const void_ptr_iterator<VoidIterU,U>& r ) { return l.base() < r.base(); @@ -200,7 +226,11 @@ namespace boost template< class VoidIterT, class T, class VoidIterU, class U > - inline bool operator<=( const void_ptr_iterator<VoidIterT,T>& l, + inline BOOST_DEDUCED_TYPENAME boost::enable_if< + ptr_container_detail::is_compatible<T, U>, + bool + >::type + operator<=( const void_ptr_iterator<VoidIterT,T>& l, const void_ptr_iterator<VoidIterU,U>& r ) { return l.base() <= r.base(); @@ -209,7 +239,11 @@ namespace boost template< class VoidIterT, class T, class VoidIterU, class U > - inline bool operator>( const void_ptr_iterator<VoidIterT,T>& l, + inline BOOST_DEDUCED_TYPENAME boost::enable_if< + ptr_container_detail::is_compatible<T, U>, + bool + >::type + operator>( const void_ptr_iterator<VoidIterT,T>& l, const void_ptr_iterator<VoidIterU,U>& r ) { return l.base() > r.base(); @@ -218,7 +252,11 @@ namespace boost template< class VoidIterT, class T, class VoidIterU, class U > - inline bool operator>=( const void_ptr_iterator<VoidIterT,T>& l, + inline BOOST_DEDUCED_TYPENAME boost::enable_if< + ptr_container_detail::is_compatible<T, U>, + bool + >::type + operator>=( const void_ptr_iterator<VoidIterT,T>& l, const void_ptr_iterator<VoidIterU,U>& r ) { return l.base() >= r.base(); |