blob: be5881f54b59af367c66165de8ef1b11e33cc8f9 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// new_switch.cpp
//
// Copyright 2011 Eric Niebler
// Copyright Pierre Esterie & Joel Falcou.
// 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/core.hpp>
#include <boost/proto/transform.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/proto/debug.hpp>
#include <boost/test/unit_test.hpp>
#include <boost/mpl/long.hpp>
#include <boost/mpl/bool.hpp>
namespace proto = boost::proto;
struct MyCases
{
template<typename Tag>
struct case_
: proto::not_<proto::_>
{};
};
template<>
struct MyCases::case_<proto::tag::shift_right>
: proto::_
{};
template<>
struct MyCases::case_<proto::tag::plus>
: proto::_
{};
struct ArityOf;
struct ArityOfCases
{
template<typename ArityOf>
struct case_
: proto::not_<proto::_>
{};
};
template<>
struct ArityOfCases::case_<boost::mpl::long_<1> >
: boost::proto::when<boost::proto::_, boost::mpl::false_()>
{};
template<>
struct ArityOfCases::case_<boost::mpl::long_<2> >
: boost::proto::when<boost::proto::_, boost::mpl::true_()>
{};
struct ArityOf
: boost::proto::switch_<
ArityOfCases
, proto::arity_of<proto::_>()
>
{};
void test_switch()
{
// Tests for backward compatibility
proto::assert_matches<proto::switch_<MyCases> >(proto::lit(1) >> 'a');
proto::assert_matches<proto::switch_<MyCases> >(proto::lit(1) + 'a');
proto::assert_matches_not<proto::switch_<MyCases> >(proto::lit(1) << 'a');
//Test new matching on the Transform result type
ArityOf ar;
proto::assert_matches_not<ArityOf>(proto::lit(1));
proto::assert_matches<ArityOf>(proto::lit(1) + 2);
proto::assert_matches<ArityOf>(!proto::lit(1));
BOOST_CHECK_EQUAL(ar(!proto::lit(1)), false);
BOOST_CHECK_EQUAL(ar(proto::lit(1) + 2), 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 proto::switch_<>");
test->add(BOOST_TEST_CASE(&test_switch));
return test;
}