vc6 ICE workarounds,

General simplification for compilers that don't support strict
interop.

Renamed "minus" -> "distance_from".


[SVN r21973]
This commit is contained in:
Dave Abrahams
2004-01-26 14:52:39 +00:00
parent 5f870d780d
commit 8480d452a9

View File

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