blob: 292e582bdb5b1de6a1c243d810b4133ca42c8cb4 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// 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;
}