2004-01-20 18:02:02 +00:00
|
|
|
// Boost.Function library
|
|
|
|
|
|
|
|
// Copyright Doug Gregor 2004. Use, modification and
|
|
|
|
// distribution is subject to the Boost Software License, Version
|
|
|
|
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
|
|
|
|
#include <boost/test/minimal.hpp>
|
|
|
|
#include <boost/function.hpp>
|
|
|
|
#include <boost/ref.hpp>
|
|
|
|
|
|
|
|
static int forty_two() { return 42; }
|
|
|
|
|
|
|
|
struct Seventeen
|
|
|
|
{
|
|
|
|
int operator()() const { return 17; }
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ReturnInt
|
|
|
|
{
|
|
|
|
explicit ReturnInt(int value) : value(value) {}
|
|
|
|
|
|
|
|
int operator()() const { return value; }
|
|
|
|
|
|
|
|
int value;
|
|
|
|
};
|
|
|
|
|
|
|
|
bool operator==(const ReturnInt& x, const ReturnInt& y)
|
|
|
|
{ return x.value == y.value; }
|
|
|
|
|
|
|
|
bool operator!=(const ReturnInt& x, const ReturnInt& y)
|
|
|
|
{ return x.value != y.value; }
|
|
|
|
|
2004-01-20 18:07:13 +00:00
|
|
|
static void target_test()
|
2004-01-20 18:02:02 +00:00
|
|
|
{
|
|
|
|
boost::function0<int> f;
|
|
|
|
|
|
|
|
f = &forty_two;
|
2004-01-20 18:07:13 +00:00
|
|
|
BOOST_TEST(*f.target<int (*)()>() == &forty_two);
|
|
|
|
BOOST_TEST(!f.target<Seventeen>());
|
2004-01-20 18:02:02 +00:00
|
|
|
|
|
|
|
f = Seventeen();
|
2004-01-20 18:07:13 +00:00
|
|
|
BOOST_TEST(!f.target<int (*)()>());
|
|
|
|
BOOST_TEST(f.target<Seventeen>());
|
2004-01-20 18:02:02 +00:00
|
|
|
|
|
|
|
Seventeen this_seventeen;
|
|
|
|
f = boost::ref(this_seventeen);
|
2004-01-20 18:07:13 +00:00
|
|
|
BOOST_TEST(!f.target<int (*)()>());
|
|
|
|
BOOST_TEST(f.target<Seventeen>());
|
|
|
|
BOOST_TEST(f.target<Seventeen>() == &this_seventeen);
|
2004-01-20 18:02:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void equal_test()
|
|
|
|
{
|
|
|
|
boost::function0<int> f;
|
|
|
|
|
|
|
|
f = &forty_two;
|
|
|
|
BOOST_TEST(f == &forty_two);
|
|
|
|
BOOST_TEST(f != ReturnInt(17));
|
2004-06-23 16:00:01 +00:00
|
|
|
#if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
|
|
|
|
BOOST_TEST(&forty_two == f);
|
2004-01-20 18:02:02 +00:00
|
|
|
BOOST_TEST(ReturnInt(17) != f);
|
2004-06-23 16:00:01 +00:00
|
|
|
#endif
|
|
|
|
|
2004-03-12 03:38:20 +00:00
|
|
|
BOOST_TEST(f.contains(&forty_two));
|
2004-01-20 18:02:02 +00:00
|
|
|
|
|
|
|
f = ReturnInt(17);
|
|
|
|
BOOST_TEST(f != &forty_two);
|
|
|
|
BOOST_TEST(f == ReturnInt(17));
|
|
|
|
BOOST_TEST(f != ReturnInt(16));
|
2004-06-23 16:00:01 +00:00
|
|
|
#if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
|
|
|
|
BOOST_TEST(&forty_two != f);
|
|
|
|
BOOST_TEST(ReturnInt(17) == f);
|
2004-01-20 18:02:02 +00:00
|
|
|
BOOST_TEST(ReturnInt(16) != f);
|
2004-06-23 16:00:01 +00:00
|
|
|
#endif
|
|
|
|
|
2004-03-12 03:38:20 +00:00
|
|
|
BOOST_TEST(f.contains(ReturnInt(17)));
|
2004-01-20 18:02:02 +00:00
|
|
|
|
|
|
|
#if !defined(BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX)
|
|
|
|
boost::function<int(void)> g;
|
|
|
|
|
|
|
|
g = &forty_two;
|
|
|
|
BOOST_TEST(g == &forty_two);
|
|
|
|
BOOST_TEST(g != ReturnInt(17));
|
2004-06-23 16:00:01 +00:00
|
|
|
# if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
|
|
|
|
BOOST_TEST(&forty_two == g);
|
2004-01-20 18:02:02 +00:00
|
|
|
BOOST_TEST(ReturnInt(17) != g);
|
2004-06-23 16:00:01 +00:00
|
|
|
# endif
|
2004-01-20 18:02:02 +00:00
|
|
|
|
|
|
|
g = ReturnInt(17);
|
|
|
|
BOOST_TEST(g != &forty_two);
|
|
|
|
BOOST_TEST(g == ReturnInt(17));
|
|
|
|
BOOST_TEST(g != ReturnInt(16));
|
2004-06-23 16:00:01 +00:00
|
|
|
# if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
|
|
|
|
BOOST_TEST(&forty_two != g);
|
|
|
|
BOOST_TEST(ReturnInt(17) == g);
|
2004-01-20 18:02:02 +00:00
|
|
|
BOOST_TEST(ReturnInt(16) != g);
|
2004-06-23 16:00:01 +00:00
|
|
|
# endif
|
2004-01-20 18:02:02 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2004-01-24 23:31:40 +00:00
|
|
|
static void ref_equal_test()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ReturnInt ri(17);
|
|
|
|
boost::function0<int> f = boost::ref(ri);
|
|
|
|
|
|
|
|
// References and values are equal
|
|
|
|
BOOST_TEST(f == boost::ref(ri));
|
|
|
|
BOOST_TEST(f == ri);
|
|
|
|
BOOST_TEST(boost::ref(ri) == f);
|
|
|
|
BOOST_TEST(!(f != boost::ref(ri)));
|
|
|
|
BOOST_TEST(!(f != ri));
|
|
|
|
BOOST_TEST(!(boost::ref(ri) != f));
|
2004-06-23 16:00:01 +00:00
|
|
|
#if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
|
|
|
|
BOOST_TEST(ri == f);
|
2004-01-24 23:31:40 +00:00
|
|
|
BOOST_TEST(!(ri != f));
|
2004-06-23 16:00:01 +00:00
|
|
|
#endif
|
2004-01-24 23:31:40 +00:00
|
|
|
|
|
|
|
// Values equal, references inequal
|
|
|
|
ReturnInt ri2(17);
|
|
|
|
BOOST_TEST(f == ri2);
|
|
|
|
BOOST_TEST(f != boost::ref(ri2));
|
|
|
|
BOOST_TEST(boost::ref(ri2) != f);
|
|
|
|
BOOST_TEST(!(f != ri2));
|
|
|
|
BOOST_TEST(!(f == boost::ref(ri2)));
|
|
|
|
BOOST_TEST(!(boost::ref(ri2) == f));
|
2004-06-23 16:00:01 +00:00
|
|
|
#if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
|
|
|
|
BOOST_TEST(ri2 == f);
|
|
|
|
BOOST_TEST(!(ri2 != f));
|
|
|
|
#endif
|
2004-01-24 23:31:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#if !defined(BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX)
|
|
|
|
{
|
|
|
|
ReturnInt ri(17);
|
|
|
|
boost::function<int(void)> f = boost::ref(ri);
|
|
|
|
|
|
|
|
// References and values are equal
|
|
|
|
BOOST_TEST(f == boost::ref(ri));
|
|
|
|
BOOST_TEST(f == ri);
|
|
|
|
BOOST_TEST(boost::ref(ri) == f);
|
|
|
|
BOOST_TEST(!(f != boost::ref(ri)));
|
|
|
|
BOOST_TEST(!(f != ri));
|
|
|
|
BOOST_TEST(!(boost::ref(ri) != f));
|
2004-06-23 16:00:01 +00:00
|
|
|
# if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
|
|
|
|
BOOST_TEST(ri == f);
|
2004-01-24 23:31:40 +00:00
|
|
|
BOOST_TEST(!(ri != f));
|
2004-06-23 16:00:01 +00:00
|
|
|
# endif
|
2004-01-24 23:31:40 +00:00
|
|
|
|
|
|
|
// Values equal, references inequal
|
|
|
|
ReturnInt ri2(17);
|
|
|
|
BOOST_TEST(f == ri2);
|
|
|
|
BOOST_TEST(f != boost::ref(ri2));
|
|
|
|
BOOST_TEST(boost::ref(ri2) != f);
|
|
|
|
BOOST_TEST(!(f != ri2));
|
|
|
|
BOOST_TEST(!(f == boost::ref(ri2)));
|
|
|
|
BOOST_TEST(!(boost::ref(ri2) == f));
|
2004-06-23 16:00:01 +00:00
|
|
|
# if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
|
|
|
|
BOOST_TEST(ri2 == f);
|
|
|
|
BOOST_TEST(!(ri2 != f));
|
|
|
|
# endif
|
2004-01-24 23:31:40 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2004-01-20 18:02:02 +00:00
|
|
|
int test_main(int, char*[])
|
|
|
|
{
|
2004-01-20 18:07:13 +00:00
|
|
|
target_test();
|
2004-01-20 18:02:02 +00:00
|
|
|
equal_test();
|
2004-01-24 23:31:40 +00:00
|
|
|
ref_equal_test();
|
2004-01-20 18:02:02 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|