| // (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; |
| } |
| |