mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-22 00:52:08 +02:00
Reverted unwanted checkin.
[SVN r21520]
This commit is contained in:
@ -63,72 +63,6 @@ namespace boost
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
|
||||||
// Determines the iterator type that can be
|
|
||||||
// safely used to implement binary operators
|
|
||||||
//
|
|
||||||
template <
|
|
||||||
class Facade1,
|
|
||||||
class Facade2
|
|
||||||
>
|
|
||||||
struct interoperable_base
|
|
||||||
: mpl::if_<
|
|
||||||
is_convertible<Facade1, Facade2>
|
|
||||||
, Facade2
|
|
||||||
, Facade1
|
|
||||||
>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
struct difference_type
|
|
||||||
{
|
|
||||||
typedef typename interoperable_base<Facade1, Facade2>::type::difference_type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
bool equal(Facade1 const&, Facade2 const&);
|
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
typename Facade1::difference_type distance_to(Facade1 const&, Facade2 const&);
|
|
||||||
|
|
||||||
template <bool UseLhsMember>
|
|
||||||
struct facade_binary_operator
|
|
||||||
{
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
static bool equal(Facade1 const& lhs,
|
|
||||||
Facade2 const& rhs)
|
|
||||||
{
|
|
||||||
return ::boost::detail::equal(lhs, rhs);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
static typename Facade1::difference_type distance_to(Facade1 const& lhs,
|
|
||||||
Facade2 const& rhs)
|
|
||||||
{
|
|
||||||
return ::boost::detail::distance_to(lhs, rhs);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct facade_binary_operator<false>
|
|
||||||
{
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
static bool equal(Facade1 const& lhs,
|
|
||||||
Facade2 const& rhs)
|
|
||||||
{
|
|
||||||
return ::boost::detail::equal(rhs, lhs);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
static typename Facade2::difference_type distance_to(Facade1 const& lhs,
|
|
||||||
Facade2 const& rhs)
|
|
||||||
{
|
|
||||||
return -::boost::detail::distance_to(rhs, lhs);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Generates associated types for an iterator_facade with the
|
// Generates associated types for an iterator_facade with the
|
||||||
// given parameters.
|
// given parameters.
|
||||||
@ -322,11 +256,9 @@ namespace boost
|
|||||||
BOOST_ITERATOR_FACADE_RELATION(>=)
|
BOOST_ITERATOR_FACADE_RELATION(>=)
|
||||||
# undef BOOST_ITERATOR_FACADE_RELATION
|
# undef BOOST_ITERATOR_FACADE_RELATION
|
||||||
|
|
||||||
template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > friend typename detail::enable_if_interoperable< Derived1, Derived2, typename std::iterator_traits<typename detail::interoperable_base<Derived1, Derived2> ::type > ::difference_type > ::type operator -( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs);
|
BOOST_ITERATOR_FACADE_INTEROP_HEAD(
|
||||||
|
friend, -, typename Derived1::difference_type)
|
||||||
// BOOST_ITERATOR_FACADE_INTEROP_HEAD(
|
;
|
||||||
// friend, -, (typename std::iterator_traits<typename detail::interoperable_base<Derived1, Derived2>::type >::difference_type))
|
|
||||||
// ;
|
|
||||||
|
|
||||||
BOOST_ITERATOR_FACADE_PLUS_HEAD(
|
BOOST_ITERATOR_FACADE_PLUS_HEAD(
|
||||||
friend
|
friend
|
||||||
@ -365,7 +297,7 @@ namespace boost
|
|||||||
template <class Facade1, class Facade2>
|
template <class Facade1, class Facade2>
|
||||||
static bool equal(Facade1 const& f1, Facade2 const& f2)
|
static bool equal(Facade1 const& f1, Facade2 const& f2)
|
||||||
{
|
{
|
||||||
return detail::facade_binary_operator< is_convertible< Facade2, Facade1 >::value >::equal(f1, f2);
|
return f1.equal(f2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Facade>
|
template <class Facade>
|
||||||
@ -375,51 +307,17 @@ namespace boost
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
template <class Facade1, class Facade2>
|
||||||
static typename detail::difference_type<Facade1, Facade2>::type distance_to(
|
static typename Facade1::difference_type distance_to(
|
||||||
Facade1 const& f1, Facade2 const& f2)
|
|
||||||
{
|
|
||||||
return detail::facade_binary_operator< is_convertible< Facade2, Facade1 >::value >::distance_to(f1, f2);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
// objects of this class are useless
|
|
||||||
iterator_core_access(); //undefined
|
|
||||||
|
|
||||||
// We would need template friends for these to be private
|
|
||||||
public:
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
static bool equal_fwd(Facade1 const& f1, Facade2 const& f2)
|
|
||||||
{
|
|
||||||
return f1.equal(f2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
static typename Facade1::difference_type distance_to_fwd(
|
|
||||||
Facade1 const& f1, Facade2 const& f2)
|
Facade1 const& f1, Facade2 const& f2)
|
||||||
{
|
{
|
||||||
return f1.distance_to(f2);
|
return f1.distance_to(f2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// objects of this class are useless
|
||||||
|
iterator_core_access(); //undefined
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace detail
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
bool equal(Facade1 const& f1, Facade2 const& f2)
|
|
||||||
{
|
|
||||||
return iterator_core_access::equal_fwd(f1, f2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
|
||||||
typename Facade1::difference_type distance_to(Facade1 const& f1, Facade2 const& f2)
|
|
||||||
{
|
|
||||||
return iterator_core_access::distance_to_fwd(f1, f2);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// iterator_facade - use as a public base class for defining new
|
// iterator_facade - use as a public base class for defining new
|
||||||
// standard-conforming iterators.
|
// standard-conforming iterators.
|
||||||
@ -652,25 +550,19 @@ namespace boost
|
|||||||
BOOST_ITERATOR_FACADE_RELATION(>=, return 0 <=, distance_to)
|
BOOST_ITERATOR_FACADE_RELATION(>=, return 0 <=, distance_to)
|
||||||
# undef BOOST_ITERATOR_FACADE_RELATION
|
# undef BOOST_ITERATOR_FACADE_RELATION
|
||||||
|
|
||||||
// // operator- requires an additional part in the static assertion
|
// operator- requires an additional part in the static assertion
|
||||||
// BOOST_ITERATOR_FACADE_INTEROP(
|
BOOST_ITERATOR_FACADE_INTEROP(
|
||||||
// -
|
-
|
||||||
// , typename Derived1::difference_type
|
, typename Derived1::difference_type
|
||||||
// , (is_same<
|
, (is_same<
|
||||||
// BOOST_DEDUCED_TYPENAME Derived1::difference_type
|
BOOST_DEDUCED_TYPENAME Derived1::difference_type
|
||||||
// , BOOST_DEDUCED_TYPENAME Derived2::difference_type
|
, BOOST_DEDUCED_TYPENAME Derived2::difference_type
|
||||||
// >::value)
|
>::value)
|
||||||
// , return
|
, return
|
||||||
// , distance_to )
|
, distance_to )
|
||||||
# undef BOOST_ITERATOR_FACADE_INTEROP
|
# undef BOOST_ITERATOR_FACADE_INTEROP
|
||||||
# undef BOOST_ITERATOR_FACADE_INTEROP_HEAD
|
# undef BOOST_ITERATOR_FACADE_INTEROP_HEAD
|
||||||
|
|
||||||
template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > typename detail::enable_if_interoperable< Derived1, Derived2, typename std::iterator_traits<typename detail::interoperable_base<Derived1, Derived2> ::type > ::difference_type > ::type operator -( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs)
|
|
||||||
{
|
|
||||||
return iterator_core_access::distance_to(static_cast<Derived2 const&>(rhs), static_cast<Derived1 const&>(lhs));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# define BOOST_ITERATOR_FACADE_PLUS(args) \
|
# define BOOST_ITERATOR_FACADE_PLUS(args) \
|
||||||
BOOST_ITERATOR_FACADE_PLUS_HEAD(inline, args) \
|
BOOST_ITERATOR_FACADE_PLUS_HEAD(inline, args) \
|
||||||
{ \
|
{ \
|
||||||
|
Reference in New Issue
Block a user