mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-20 08:02:10 +02:00
vc6 ICE workarounds,
General simplification for compilers that don't support strict interop. Renamed "minus" -> "distance_from". [SVN r21973]
This commit is contained in:
@ -45,19 +45,27 @@ namespace boost
|
|||||||
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
// A binary metafunction class that always returns bool. VC6
|
||||||
|
// ICEs on mpl::always<bool>, probably because of the default
|
||||||
|
// parameters.
|
||||||
|
struct always_bool2
|
||||||
|
{
|
||||||
|
template <class T, class U>
|
||||||
|
struct apply
|
||||||
|
{
|
||||||
|
typedef bool type;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// enable if for use in operator implementation.
|
// enable if for use in operator implementation.
|
||||||
//
|
//
|
||||||
// enable_if_interoperable falls back to always enabled for compilers
|
|
||||||
// that don't support enable_if or is_convertible.
|
|
||||||
//
|
|
||||||
template <
|
template <
|
||||||
class Facade1
|
class Facade1
|
||||||
, class Facade2
|
, class Facade2
|
||||||
, class Return
|
, class Return
|
||||||
>
|
>
|
||||||
struct enable_if_interoperable
|
struct enable_if_interoperable
|
||||||
#ifndef BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY
|
|
||||||
: ::boost::iterators::enable_if<
|
: ::boost::iterators::enable_if<
|
||||||
mpl::or_<
|
mpl::or_<
|
||||||
is_convertible<Facade1, Facade2>
|
is_convertible<Facade1, Facade2>
|
||||||
@ -65,11 +73,7 @@ namespace boost
|
|||||||
>
|
>
|
||||||
, Return
|
, Return
|
||||||
>
|
>
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
#ifdef BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY
|
|
||||||
typedef Return type;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -250,6 +254,17 @@ namespace boost
|
|||||||
|
|
||||||
|
|
||||||
// Macros which describe the declarations of binary operators
|
// Macros which describe the declarations of binary operators
|
||||||
|
# ifdef BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY
|
||||||
|
# define BOOST_ITERATOR_FACADE_INTEROP_HEAD(prefix, op, result_type) \
|
||||||
|
template < \
|
||||||
|
class Derived1, class V1, class TC1, class R1, class D1 \
|
||||||
|
, class Derived2, class V2, class TC2, class R2, class D2 \
|
||||||
|
> \
|
||||||
|
prefix typename mpl::apply2<result_type,Derived1,Derived2>::type \
|
||||||
|
operator op( \
|
||||||
|
iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs \
|
||||||
|
, iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs)
|
||||||
|
# else
|
||||||
# define BOOST_ITERATOR_FACADE_INTEROP_HEAD(prefix, op, result_type) \
|
# define BOOST_ITERATOR_FACADE_INTEROP_HEAD(prefix, op, result_type) \
|
||||||
template < \
|
template < \
|
||||||
class Derived1, class V1, class TC1, class R1, class D1 \
|
class Derived1, class V1, class TC1, class R1, class D1 \
|
||||||
@ -262,6 +277,7 @@ namespace boost
|
|||||||
operator op( \
|
operator op( \
|
||||||
iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs \
|
iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs \
|
||||||
, iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs)
|
, iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs)
|
||||||
|
# endif
|
||||||
|
|
||||||
# define BOOST_ITERATOR_FACADE_PLUS_HEAD(prefix,args) \
|
# define BOOST_ITERATOR_FACADE_PLUS_HEAD(prefix,args) \
|
||||||
template <class Derived, class V, class TC, class R, class D> \
|
template <class Derived, class V, class TC, class R, class D> \
|
||||||
@ -287,8 +303,8 @@ namespace boost
|
|||||||
|
|
||||||
template <class I, class V, class TC, class R, class D> friend class iterator_facade;
|
template <class I, class V, class TC, class R, class D> friend class iterator_facade;
|
||||||
|
|
||||||
# define BOOST_ITERATOR_FACADE_RELATION(op) \
|
# define BOOST_ITERATOR_FACADE_RELATION(op) \
|
||||||
BOOST_ITERATOR_FACADE_INTEROP_HEAD(friend,op, mpl::always<bool>);
|
BOOST_ITERATOR_FACADE_INTEROP_HEAD(friend,op, detail::always_bool2);
|
||||||
|
|
||||||
BOOST_ITERATOR_FACADE_RELATION(==)
|
BOOST_ITERATOR_FACADE_RELATION(==)
|
||||||
BOOST_ITERATOR_FACADE_RELATION(!=)
|
BOOST_ITERATOR_FACADE_RELATION(!=)
|
||||||
@ -356,14 +372,14 @@ namespace boost
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
template <class Facade1, class Facade2>
|
||||||
static typename Facade1::difference_type minus(
|
static typename Facade1::difference_type distance_from(
|
||||||
Facade1 const& f1, Facade2 const& f2, mpl::true_)
|
Facade1 const& f1, Facade2 const& f2, mpl::true_)
|
||||||
{
|
{
|
||||||
return -f1.distance_to(f2);
|
return -f1.distance_to(f2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Facade1, class Facade2>
|
template <class Facade1, class Facade2>
|
||||||
static typename Facade2::difference_type minus(
|
static typename Facade2::difference_type distance_from(
|
||||||
Facade1 const& f1, Facade2 const& f2, mpl::false_)
|
Facade1 const& f1, Facade2 const& f2, mpl::false_)
|
||||||
{
|
{
|
||||||
return f2.distance_to(f1);
|
return f2.distance_to(f1);
|
||||||
@ -598,7 +614,7 @@ namespace boost
|
|||||||
# define BOOST_ITERATOR_FACADE_RELATION(op, return_prefix, base_op) \
|
# define BOOST_ITERATOR_FACADE_RELATION(op, return_prefix, base_op) \
|
||||||
BOOST_ITERATOR_FACADE_INTEROP( \
|
BOOST_ITERATOR_FACADE_INTEROP( \
|
||||||
op \
|
op \
|
||||||
, mpl::always<bool> \
|
, detail::always_bool2 \
|
||||||
, return_prefix \
|
, return_prefix \
|
||||||
, base_op \
|
, base_op \
|
||||||
)
|
)
|
||||||
@ -606,10 +622,10 @@ namespace boost
|
|||||||
BOOST_ITERATOR_FACADE_RELATION(==, return, equal)
|
BOOST_ITERATOR_FACADE_RELATION(==, return, equal)
|
||||||
BOOST_ITERATOR_FACADE_RELATION(!=, return !, equal)
|
BOOST_ITERATOR_FACADE_RELATION(!=, return !, equal)
|
||||||
|
|
||||||
BOOST_ITERATOR_FACADE_RELATION(<, return 0 >, minus)
|
BOOST_ITERATOR_FACADE_RELATION(<, return 0 >, distance_from)
|
||||||
BOOST_ITERATOR_FACADE_RELATION(>, return 0 <, minus)
|
BOOST_ITERATOR_FACADE_RELATION(>, return 0 <, distance_from)
|
||||||
BOOST_ITERATOR_FACADE_RELATION(<=, return 0 >=, minus)
|
BOOST_ITERATOR_FACADE_RELATION(<=, return 0 >=, distance_from)
|
||||||
BOOST_ITERATOR_FACADE_RELATION(>=, return 0 <=, minus)
|
BOOST_ITERATOR_FACADE_RELATION(>=, return 0 <=, distance_from)
|
||||||
# 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
|
||||||
@ -617,7 +633,7 @@ namespace boost
|
|||||||
-
|
-
|
||||||
, detail::choose_difference_type
|
, detail::choose_difference_type
|
||||||
, return
|
, return
|
||||||
, minus
|
, distance_from
|
||||||
)
|
)
|
||||||
# undef BOOST_ITERATOR_FACADE_INTEROP
|
# undef BOOST_ITERATOR_FACADE_INTEROP
|
||||||
# undef BOOST_ITERATOR_FACADE_INTEROP_HEAD
|
# undef BOOST_ITERATOR_FACADE_INTEROP_HEAD
|
||||||
|
Reference in New Issue
Block a user