123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- ///////////////////////////////////////////////////////////////////////////////
- // constrained_ops.cpp
- //
- // Copyright 2010 Thomas Heller
- // Copyright 2011 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/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); // false
- proto::assert_matches_not<equation>(j); // false
- proto::assert_matches_not<equation>(i + i); // false
- proto::assert_matches_not<equation>(j + j); // false
- #if 0
- proto::assert_matches_not<equation>(i + j); // compile error (by design)
- proto::assert_matches_not<equation>(j + i); // compile error (by design)
- #endif
- proto::assert_matches<equation>(i == j); // true
- proto::assert_matches<equation>(i == j + j); // true
- proto::assert_matches<equation>(i + i == j); // true
- proto::assert_matches<equation>(i + i == j + j); // true
- }
- 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 constrained EDSLs");
- test->add(BOOST_TEST_CASE(&test_constrained_ops));
- return test;
- }
|