Ticket #5963: ptr_container.vp_iterator.comparators.3.patch

File ptr_container.vp_iterator.comparators.3.patch, 4.2 KB (added by Rob Desbois <rob.desbois@…>, 11 years ago)

Revised patch obsoletes earlier patches

  • boost/ptr_container/detail/void_ptr_iterator.hpp

    diff -Naur boost_1_47_0-orig/boost/ptr_container/detail/void_ptr_iterator.hpp boost_1_47_0/boost/ptr_container/detail/void_ptr_iterator.hpp
    old new  
    161161            return r;
    162162        }
    163163
     164
     165        namespace ptr_container_detail
     166        {
     167            template<typename T, typename U>
     168            struct is_compatible
     169            {
     170                static const bool value = boost::is_same< typename boost::remove_const<T>::type, typename boost::remove_const<U>::type >::value;
     171            };
     172        }
     173
     174         
    164175        template< class VoidIter, class T, class VoidIterU, class U >
    165         inline BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type
     176        inline BOOST_DEDUCED_TYPENAME boost::enable_if<
     177            ptr_container_detail::is_compatible<T, U>,
     178            BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type
     179        >::type
    166180        operator-( void_ptr_iterator<VoidIter,T> l,
    167181                   void_ptr_iterator<VoidIterU,U> r )
    168182
     
    173187
    174188
    175189        template< class VoidIterT, class T, class VoidIterU, class U >
    176         inline bool operator==( const void_ptr_iterator<VoidIterT,T>& l,
     190        inline BOOST_DEDUCED_TYPENAME boost::enable_if<
     191            ptr_container_detail::is_compatible<T, U>,
     192            bool
     193        >::type
     194        operator==( const void_ptr_iterator<VoidIterT,T>& l,
    177195                                const void_ptr_iterator<VoidIterU,U>& r )
    178196        {
    179197            return l.base() == r.base();
     
    182200
    183201       
    184202        template< class VoidIterT, class T, class VoidIterU, class U >
    185         inline bool operator!=( const void_ptr_iterator<VoidIterT,T>& l,
     203        inline BOOST_DEDUCED_TYPENAME boost::enable_if<
     204            ptr_container_detail::is_compatible<T, U>,
     205            bool
     206        >::type
     207        operator!=( const void_ptr_iterator<VoidIterT,T>& l,
    186208                                const void_ptr_iterator<VoidIterU,U>& r )
    187209        {
    188210            return l.base() != r.base();
     
    191213
    192214
    193215        template< class VoidIterT, class T, class VoidIterU, class U >
    194         inline bool operator<( const void_ptr_iterator<VoidIterT,T>& l,
     216        inline BOOST_DEDUCED_TYPENAME boost::enable_if<
     217            ptr_container_detail::is_compatible<T, U>,
     218            bool
     219        >::type
     220        operator<( const void_ptr_iterator<VoidIterT,T>& l,
    195221                               const void_ptr_iterator<VoidIterU,U>& r )
    196222        {
    197223            return l.base() < r.base();
     
    200226
    201227       
    202228        template< class VoidIterT, class T, class VoidIterU, class U >
    203         inline bool operator<=( const void_ptr_iterator<VoidIterT,T>& l,
     229        inline BOOST_DEDUCED_TYPENAME boost::enable_if<
     230            ptr_container_detail::is_compatible<T, U>,
     231            bool
     232        >::type
     233        operator<=( const void_ptr_iterator<VoidIterT,T>& l,
    204234                               const void_ptr_iterator<VoidIterU,U>& r )
    205235        {
    206236            return l.base() <= r.base();
     
    209239
    210240       
    211241        template< class VoidIterT, class T, class VoidIterU, class U >
    212         inline bool operator>( const void_ptr_iterator<VoidIterT,T>& l,
     242        inline BOOST_DEDUCED_TYPENAME boost::enable_if<
     243            ptr_container_detail::is_compatible<T, U>,
     244            bool
     245        >::type
     246        operator>( const void_ptr_iterator<VoidIterT,T>& l,
    213247                               const void_ptr_iterator<VoidIterU,U>& r )
    214248        {
    215249            return l.base() > r.base();
     
    218252
    219253       
    220254        template< class VoidIterT, class T, class VoidIterU, class U >
    221         inline bool operator>=( const void_ptr_iterator<VoidIterT,T>& l,
     255        inline BOOST_DEDUCED_TYPENAME boost::enable_if<
     256            ptr_container_detail::is_compatible<T, U>,
     257            bool
     258        >::type
     259        operator>=( const void_ptr_iterator<VoidIterT,T>& l,
    222260                               const void_ptr_iterator<VoidIterU,U>& r )
    223261        {
    224262            return l.base() >= r.base();