82 lines
2.2 KiB
C++
82 lines
2.2 KiB
C++
// (C) Copyright John Maddock 2005.
|
|
// Use, modification and distribution are 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)
|
|
|
|
#ifdef TEST_STD_HEADERS
|
|
#include <functional>
|
|
#else
|
|
#include <boost/tr1/functional.hpp>
|
|
#endif
|
|
|
|
#include <boost/static_assert.hpp>
|
|
#include <boost/type_traits/is_base_and_derived.hpp>
|
|
#include "verify_return.hpp"
|
|
|
|
struct test_functor
|
|
{
|
|
int operator()()const;
|
|
long operator()(int)const;
|
|
double operator()(int, char)const;
|
|
};
|
|
|
|
void nothing(){}
|
|
|
|
template <class Func>
|
|
void test_function(Func*)
|
|
{
|
|
typedef typename Func::result_type result_type;
|
|
|
|
test_functor t;
|
|
Func f1;
|
|
Func f2(0);
|
|
Func f3(f1);
|
|
Func f4(t);
|
|
|
|
f2 = f1;
|
|
f2 = 0;
|
|
f2 = t;
|
|
f2 = std::tr1::ref(t);
|
|
f2 = std::tr1::cref(t);
|
|
const Func& cf = f1;
|
|
|
|
std::tr1::swap(f1, f2);
|
|
if(cf) nothing();
|
|
if(cf && f2) nothing();
|
|
if(cf || f2) nothing();
|
|
if(f2 && !cf) nothing();
|
|
|
|
//const std::type_info& info = cf.target_type();
|
|
test_functor* func1 = f1.template target<test_functor>();
|
|
const test_functor* func2 = cf.template target<test_functor>();
|
|
|
|
// comparison with null:
|
|
if(0 == f1) nothing();
|
|
if(0 != f1) nothing();
|
|
if(f2 == 0) nothing();
|
|
if(f2 != 0) nothing();
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::exception, std::tr1::bad_function_call>::value));
|
|
std::tr1::bad_function_call fe;
|
|
|
|
test_function(static_cast<std::tr1::function<int (void)>* >(0));
|
|
test_function(static_cast<std::tr1::function<long (int)>* >(0));
|
|
test_function(static_cast<std::tr1::function<double (int,char)>* >(0));
|
|
|
|
std::tr1::function<int (void)> f1;
|
|
verify_return_type(f1(), int(0));
|
|
std::tr1::function<long (int)> f2;
|
|
verify_return_type(f2(0), long(0));
|
|
std::tr1::function<double (int, char)> f3;
|
|
verify_return_type(f3(0,0), double(0));
|
|
|
|
//BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::unary_function<int, long>, std::tr1::function<long (int)> >::value));
|
|
//BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::binary_function<int, char, double>, std::tr1::function<double (int,char)> >::value));
|
|
return 0;
|
|
}
|
|
|