| /////////////////////////////////////////////////////////////////////////////// |
| // mpl.hpp |
| // |
| // Copyright 2012 Eric Niebler. 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 <boost/proto/proto.hpp> |
| #include <boost/fusion/mpl.hpp> |
| #include <boost/mpl/pop_back.hpp> |
| #include <boost/type_traits/is_same.hpp> |
| #include <boost/static_assert.hpp> |
| #include <boost/test/unit_test.hpp> |
| namespace mpl = boost::mpl; |
| namespace proto = boost::proto; |
| namespace fusion = boost::fusion; |
| using proto::_; |
| |
| template<class E> |
| struct my_expr; |
| |
| struct my_domain |
| : proto::domain<proto::generator<my_expr> > |
| {}; |
| |
| template<class E> |
| struct my_expr |
| : proto::extends<E, my_expr<E>, my_domain> |
| { |
| my_expr(E const &e = E()) |
| : proto::extends<E, my_expr<E>, my_domain>(e) |
| {} |
| |
| typedef fusion::fusion_sequence_tag tag; |
| }; |
| |
| template<typename T> |
| void test_impl(T const &) |
| { |
| typedef typename mpl::pop_back<T>::type result_type; |
| BOOST_STATIC_ASSERT( |
| (boost::is_same< |
| result_type |
| , my_expr<proto::basic_expr<proto::tag::plus, proto::list1<my_expr<proto::terminal<int>::type>&> > > |
| >::value) |
| ); |
| } |
| |
| // Test that we can call mpl algorithms on proto expression types, and get proto expression types back |
| void test_mpl() |
| { |
| my_expr<proto::terminal<int>::type> i; |
| test_impl(i + i); |
| } |
| |
| using namespace boost::unit_test; |
| /////////////////////////////////////////////////////////////////////////////// |
| // init_unit_test_suite |
| // |
| test_suite* init_unit_test_suite( int argc, char* argv[] ) |
| { |
| test_suite *test = BOOST_TEST_SUITE("test proto mpl integration via fusion"); |
| |
| test->add(BOOST_TEST_CASE(&test_mpl)); |
| |
| return test; |
| } |