1///////////////////////////////////////////////////////////////////////////////
2// protect.hpp
3//
4// Copyright 2012 Eric Niebler. Distributed under the Boost
5// Software License, Version 1.0. (See accompanying file
6// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7
8#include <boost/proto/core.hpp>
9#include <boost/proto/transform/make.hpp>
10#include <boost/type_traits/add_pointer.hpp>
11#include <boost/type_traits/remove_pointer.hpp>
12#include <boost/test/unit_test.hpp>
13namespace proto=boost::proto;
14using proto::_;
15
16template<typename T>
17struct identity
18{
19 typedef T type;
20};
21
22struct TestWithMake
23 : proto::make< proto::protect<_> >
24{};
25
26struct TestWithMake1
27 : proto::make< identity<proto::protect<_> > >
28{};
29
30struct TestWithMake2
31 : proto::make< identity<proto::protect<int> > >
32{};
33
34struct TestWithMake3
35 : proto::make< identity<proto::protect<identity<_> > > >
36{};
37
38struct TestWithMake4
39 : proto::make< identity<proto::protect<identity<int> > > >
40{};
41
42struct TestWithMake5
43 : proto::make< identity<proto::protect<identity<identity<int> > > > >
44{};
45
46void test_protect_with_make()
47{
48 proto::terminal<int>::type i = {.child0: 42};
49
50 _ t = TestWithMake()(i);
51 _ t1 = TestWithMake1()(i);
52 int t2 = TestWithMake2()(i);
53 identity<_> t3 = TestWithMake3()(i);
54 identity<int> t4 = TestWithMake4()(i);
55 identity<identity<int> > t5 = TestWithMake5()(i);
56}
57
58//struct TestWithWhen
59// : proto::when<_, proto::protect<_>() >
60//{};
61
62struct TestWithWhen1
63 : proto::when<_, identity<proto::protect<_> >() >
64{};
65
66struct TestWithWhen2
67 : proto::when<_, identity<proto::protect<int> >() >
68{};
69
70struct TestWithWhen3
71 : proto::when<_, identity<proto::protect<identity<_> > >() >
72{};
73
74struct TestWithWhen4
75 : proto::when<_, identity<proto::protect<identity<int> > >() >
76{};
77
78struct TestWithWhen5
79 : proto::when<_, identity<proto::protect<identity<identity<int> > > >() >
80{};
81
82void test_protect_with_when()
83{
84 proto::terminal<int>::type i = {.child0: 42};
85
86 //_ t = TestWithWhen()(i);
87 _ t1 = TestWithWhen1()(i);
88 int t2 = TestWithWhen2()(i);
89 identity<_> t3 = TestWithWhen3()(i);
90 identity<int> t4 = TestWithWhen4()(i);
91 identity<identity<int> > t5 = TestWithWhen5()(i);
92}
93
94using namespace boost::unit_test;
95///////////////////////////////////////////////////////////////////////////////
96// init_unit_test_suite
97//
98test_suite* init_unit_test_suite( int argc, char* argv[] )
99{
100 test_suite *test = BOOST_TEST_SUITE("test proto::protect");
101
102 test->add(BOOST_TEST_CASE(&test_protect_with_make));
103 test->add(BOOST_TEST_CASE(&test_protect_with_when));
104
105 return test;
106}
107

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