blob: 4ace411292599d26a2867420e3e71bce04a8844b [file] [log] [blame]
/*=============================================================================
Copyright (c) 2001-2007 Joel de Guzman
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 <cmath>
#include <boost/noncopyable.hpp>
#include <boost/detail/lightweight_test.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_bind.hpp>
using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;
using namespace std;
namespace phx = boost::phoenix;
namespace test
{
struct x : boost::noncopyable // test non-copyable (hold this by reference)
{
int m;
};
struct xx {
int m;
};
}
template<class T, class F>
void write_test(F f) {
T x_;
bind(&T::m, f(x_))() = 122;
BOOST_TEST(x_.m == 122);
bind(&T::m, arg1)(f(x_)) = 123;
BOOST_TEST(x_.m == 123);
}
template<class T, class F>
void read_test(F f) {
T x_;
x_.m = 123;
BOOST_TEST(bind(&T::m, f(x_))() == 123);
BOOST_TEST(bind(&T::m, arg1)(f(x_)) == 123);
}
struct identity
{
template<class T>
T& operator()(T& t) const
{
return t;
}
};
struct constify
{
template<class T>
const T& operator()(const T& t) const
{
return t;
}
};
struct add_pointer
{
template<class T>
T* const operator()(T& t) const
{
return &t;
}
};
struct add_const_pointer
{
template<class T>
const T* const operator()(const T& t) const
{
return &t;
}
};
int
main()
{
write_test<test::x>(identity());
write_test<test::x>(add_pointer());
write_test<test::xx>(identity());
write_test<test::xx>(add_pointer());
read_test<test::x>(identity());
//read_test<test::x>(constify()); // this fails because of capture by value.
read_test<test::x>(add_pointer());
read_test<test::x>(add_const_pointer());
read_test<test::xx>(identity());
//read_test<test::xx>(constify());// this fails because of capture by value.
read_test<test::xx>(add_pointer());
read_test<test::xx>(add_const_pointer());
return boost::report_errors();
}