1///////////////////////////////////////////////////////////////////////////////
2// new_switch.cpp
3//
4// Copyright 2011 Eric Niebler
5// Copyright Pierre Esterie & Joel Falcou.
6// Distributed under the Boost
7// Software License, Version 1.0. (See accompanying file
8// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9
10#include <boost/proto/core.hpp>
11#include <boost/proto/transform.hpp>
12#include <boost/detail/workaround.hpp>
13#include <boost/proto/debug.hpp>
14#include <boost/test/unit_test.hpp>
15#include <boost/mpl/long.hpp>
16#include <boost/mpl/bool.hpp>
17
18namespace proto = boost::proto;
19
20struct MyCases
21{
22 template<typename Tag>
23 struct case_
24 : proto::not_<proto::_>
25 {};
26};
27
28template<>
29struct MyCases::case_<proto::tag::shift_right>
30 : proto::_
31{};
32
33template<>
34struct MyCases::case_<proto::tag::plus>
35 : proto::_
36{};
37
38struct ArityOf;
39
40struct ArityOfCases
41{
42 template<typename ArityOf>
43 struct case_
44 : proto::not_<proto::_>
45 {};
46};
47
48
49template<>
50struct ArityOfCases::case_<boost::mpl::long_<1> >
51 : boost::proto::when<boost::proto::_, boost::mpl::false_()>
52{};
53
54template<>
55struct ArityOfCases::case_<boost::mpl::long_<2> >
56 : boost::proto::when<boost::proto::_, boost::mpl::true_()>
57{};
58
59struct ArityOf
60 : boost::proto::switch_<
61 ArityOfCases
62 , proto::arity_of<proto::_>()
63 >
64{};
65
66void test_switch()
67{
68 // Tests for backward compatibility
69 proto::assert_matches<proto::switch_<MyCases> >(proto::lit(t: 1) >> 'a');
70 proto::assert_matches<proto::switch_<MyCases> >(proto::lit(t: 1) + 'a');
71 proto::assert_matches_not<proto::switch_<MyCases> >(proto::lit(t: 1) << 'a');
72
73 //Test new matching on the Transform result type
74 ArityOf ar;
75
76 proto::assert_matches_not<ArityOf>(proto::lit(t: 1));
77 proto::assert_matches<ArityOf>(proto::lit(t: 1) + 2);
78 proto::assert_matches<ArityOf>(!proto::lit(t: 1));
79 BOOST_CHECK_EQUAL(ar(!proto::lit(1)), false);
80 BOOST_CHECK_EQUAL(ar(proto::lit(1) + 2), true);
81}
82
83using namespace boost::unit_test;
84///////////////////////////////////////////////////////////////////////////////
85// init_unit_test_suite
86//
87test_suite* init_unit_test_suite(int argc, char* argv[])
88{
89 test_suite *test = BOOST_TEST_SUITE("test proto::switch_<>");
90
91 test->add(BOOST_TEST_CASE(&test_switch));
92
93 return test;
94}
95
96

source code of boost/libs/proto/test/switch.cpp