68 lines
1.7 KiB
C++
68 lines
1.7 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// 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;
|
|
}
|