blob: 22b1f1576d1c2b3e737bda0d8fa5a3c45b33a0fc [file] [log] [blame]
//////////////////////////////////////////////////////////////////
//
// lazy_ptr_tests.cpp
//
// Tests for ptr_to_fun, ptr_to_fun0 and ptr_to_mem_fun.
//
//
/*=============================================================================
Copyright (c) 2000-2003 Brian McNamara and Yannis Smaragdakis
Copyright (c) 2001-2007 Joel de Guzman
Copyright (c) 2015 John Fletcher
Distributed under 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 <iostream>
#include <boost/phoenix/core.hpp>
#include <boost/phoenix/function.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/phoenix/function/lazy_prelude.hpp>
#include <boost/detail/lightweight_test.hpp>
using namespace boost::phoenix;
using std::cout;
using std::endl;
namespace example {
int footle()
{
return 0;
}
int foobar(int x)
{
return 2*x;
}
int foxy(int x,int y)
{
return x*y;
}
int foxyz(int x,int y,int z)
{
return x*y + z;
}
int fwxyz(int w,int x,int y,int z)
{
return w + x*y + z;
}
}
struct O {
int aa;
O( int a ) : aa(a) {}
int cf( int x ) const { return x+1; }
int f( int x ) { return ++aa + x; }
int a() const { return aa; }
};
int main() {
using boost::phoenix::arg_names::arg1;
using boost::phoenix::arg_names::arg2;
using boost::phoenix::arg_names::arg3;
using boost::phoenix::arg_names::arg4;
BOOST_TEST( ptr_to_fun0(&example::footle)()() == 0 );
BOOST_TEST( ptr_to_fun(&example::foobar)(arg1)(1) == 2 );
BOOST_TEST( ptr_to_fun(&example::foxy)(arg1,arg2)(2,3) == 6 );
BOOST_TEST( ptr_to_fun(&example::foxyz)(arg1,arg2,arg3)(2,3,4) == 10 );
BOOST_TEST( ptr_to_fun(&example::fwxyz)(arg1,arg2,arg3,arg4)(1,2,3,4) == 11);
O o(1);
BOOST_TEST( ptr_to_mem_fun( &O::a )( &o )() == 1 );
BOOST_TEST( ptr_to_mem_fun( &O::cf )( &o, 1 )() == 2 );
BOOST_TEST( ptr_to_mem_fun( &O::f )( &o, 1 )() == 3 );
BOOST_TEST( ptr_to_mem_fun( &O::f )( &o, 1 )() == 4 );
BOOST_TEST( ptr_to_mem_fun( &O::cf )( &o, 1 )() == 2 );
O oo(1);
BOOST_TEST( ptr_to_mem_fun( &O::a )( arg1 )( &oo ) == 1 );
BOOST_TEST( ptr_to_mem_fun( &O::cf )( &oo, arg1 )(1) == 2 );
BOOST_TEST( ptr_to_mem_fun( &O::f )( &oo, arg1 )(1) == 3 );
BOOST_TEST( ptr_to_mem_fun( &O::f )( &oo, arg1 )(1) == 4 );
BOOST_TEST( ptr_to_mem_fun( &O::cf )( &oo, arg1 )(1) == 2 );
const O p(1);
BOOST_TEST( ptr_to_mem_fun( &O::a )( &p )() == 1 );
BOOST_TEST( ptr_to_mem_fun( &O::cf )( &p, 1 )() == 2 );
boost::shared_ptr<O> r( new O(3) );
BOOST_TEST( ptr_to_mem_fun( &O::a )( r )() == 3 );
BOOST_TEST( ptr_to_mem_fun( &O::cf )( r, 1 )() == 2 );
BOOST_TEST( ptr_to_mem_fun( &O::f )( r, 1 )() == 5 );
BOOST_TEST( ptr_to_mem_fun( &O::f )( r, 1 )() == 6 );
BOOST_TEST( ptr_to_mem_fun( &O::cf )( r, 1 )() == 2 );
boost::shared_ptr<const O> s( new O(3) );
BOOST_TEST( ptr_to_mem_fun( &O::a )( s )() == 3 );
BOOST_TEST( ptr_to_mem_fun( &O::cf )( s, 1 )() == 2 );
return boost::report_errors();
}