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