#include <boost/proto/proto.hpp>
#include <boost/test/unit_test.hpp>
using namespace boost;
typedef proto::terminal<int>::type term;
struct equation;
struct addition:
proto::or_
<
proto::terminal<proto::_>,
proto::plus<addition, addition>
>
{};
struct equation:
proto::or_
<
proto::equal_to<addition, addition>
>
{};
template<class Expr>
struct extension;
struct my_domain:
proto::domain
<
proto::pod_generator<extension>,
equation,
proto::default_domain
>
{};
template<class Expr>
struct lhs_extension;
struct my_lhs_domain:
proto::domain
<
proto::pod_generator<lhs_extension>,
addition,
my_domain
>
{};
template<class Expr>
struct rhs_extension;
struct my_rhs_domain:
proto::domain
<
proto::pod_generator<rhs_extension>,
addition,
my_domain
>
{};
template<class Expr>
struct extension
{
BOOST_PROTO_BASIC_EXTENDS(
Expr
, extension<Expr>
, my_domain
)
void test() const
{}
};
template<class Expr>
struct lhs_extension
{
BOOST_PROTO_BASIC_EXTENDS(
Expr
, lhs_extension<Expr>
, my_lhs_domain
)
};
template<class Expr>
struct rhs_extension
{
BOOST_PROTO_BASIC_EXTENDS(
Expr
, rhs_extension<Expr>
, my_rhs_domain
)
};
void test_constrained_ops()
{
lhs_extension<term> const i = {};
rhs_extension<term> const j = {};
proto::assert_matches_not<equation>(i); proto::assert_matches_not<equation>(j); proto::assert_matches_not<equation>(i + i); proto::assert_matches_not<equation>(j + j); #if 0#endif
proto::assert_matches<equation>(i == j); proto::assert_matches<equation>(i == j + j); proto::assert_matches<equation>(i + i == j); proto::assert_matches<equation>(i + i == j + j); }
using namespace boost::unit_test;
test_suite* init_unit_test_suite( int argc, char* argv[] )
{
test_suite *test = BOOST_TEST_SUITE("test constrained EDSLs");
test->add(BOOST_TEST_CASE(&test_constrained_ops));
return test;
}