Peter Dimov's ADL workarounds

[SVN r27808]
This commit is contained in:
Douglas Gregor
2005-03-24 19:13:33 +00:00
parent 354b8b802e
commit 24ce3091d0

View File

@ -31,6 +31,8 @@ bool operator==(const ReturnInt& x, const ReturnInt& y)
bool operator!=(const ReturnInt& x, const ReturnInt& y)
{ return x.value != y.value; }
namespace contain_test {
struct ReturnIntFE
{
explicit ReturnIntFE(int value) : value(value) {}
@ -40,11 +42,35 @@ struct ReturnIntFE
int value;
};
namespace boost {
bool function_equal(const ReturnIntFE& x, const ReturnIntFE& y)
{ return x.value == y.value; }
}
#ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
namespace contain_test {
# ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
bool function_equal(const ReturnIntFE& x, const ReturnIntFE& y)
{ return x.value == y.value; }
# else
bool function_equal_impl(const ReturnIntFE& x, const ReturnIntFE& y, int)
{ return x.value == y.value; }
# endif // #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
}
#else // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
namespace boost {
# ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
bool
function_equal(const contain_test::ReturnIntFE& x,
const contain_test::ReturnIntFE& y)
{ return x.value == y.value; }
# else
bool
function_equal_impl(const contain_test::ReturnIntFE& x,
const contain_test::ReturnIntFE& y, int)
{ return x.value == y.value; }
# endif
}
#endif
static void target_test()
{
boost::function0<int> f;
@ -90,17 +116,17 @@ static void equal_test()
BOOST_CHECK(f.contains(ReturnInt(17)));
f = ReturnIntFE(17);
f = contain_test::ReturnIntFE(17);
BOOST_CHECK(f != &forty_two);
BOOST_CHECK(f == ReturnIntFE(17));
BOOST_CHECK(f != ReturnIntFE(16));
BOOST_CHECK(f == contain_test::ReturnIntFE(17));
BOOST_CHECK(f != contain_test::ReturnIntFE(16));
#if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
BOOST_CHECK(&forty_two != f);
BOOST_CHECK(ReturnIntFE(17) == f);
BOOST_CHECK(ReturnIntFE(16) != f);
BOOST_CHECK(contain_test::ReturnIntFE(17) == f);
BOOST_CHECK(contain_test::ReturnIntFE(16) != f);
#endif
BOOST_CHECK(f.contains(ReturnIntFE(17)));
BOOST_CHECK(f.contains(contain_test::ReturnIntFE(17)));
#if !defined(BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX)
boost::function<int(void)> g;