1 ///////////////////////////////////////////////////////////////////////////////
2 // make.hpp
3 //
4 //  Copyright 2008 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/arg.hpp>
10 #include <boost/proto/transform/make.hpp>
11 #include <boost/mpl/identity.hpp>
12 #include <boost/test/unit_test.hpp>
13 
14 namespace mpl = boost::mpl;
15 namespace proto = boost::proto;
16 using proto::_;
17 
18 template<typename T>
19 struct type2type {};
20 
21 template<typename T>
22 struct wrapper
23 {
24     T t_;
wrapperwrapper25     explicit wrapper(T const & t = T()) : t_(t) {}
26 };
27 
28 template<typename T>
29 struct careful
30 {
31     typedef typename T::not_there not_there;
32 };
33 
34 // Test that when no substitution is done, we don't instantiate templates
35 struct MakeTest1
36   : proto::make< type2type< careful<int> > >
37 {};
38 
make_test1()39 void make_test1()
40 {
41     proto::terminal<int>::type i = {42};
42     type2type< careful<int> > res = MakeTest1()(i);
43 }
44 
45 // Test that when substitution is done, and there is no nested ::type
46 // typedef, the result is the wrapper
47 struct MakeTest2
48   : proto::make< wrapper< proto::_value > >
49 {};
50 
make_test2()51 void make_test2()
52 {
53     proto::terminal<int>::type i = {42};
54     wrapper<int> res = MakeTest2()(i);
55     BOOST_CHECK_EQUAL(res.t_, 0);
56 }
57 
58 // Test that when substitution is done, and there is no nested ::type
59 // typedef, the result is the wrapper
60 struct MakeTest3
61   : proto::make< wrapper< proto::_value >(proto::_value) >
62 {};
63 
make_test3()64 void make_test3()
65 {
66     proto::terminal<int>::type i = {42};
67     wrapper<int> res = MakeTest3()(i);
68     BOOST_CHECK_EQUAL(res.t_, 42);
69 }
70 
71 // Test that when substitution is done, and there is no nested ::type
72 // typedef, the result is the wrapper
73 struct MakeTest4
74   : proto::make< mpl::identity< proto::_value >(proto::_value) >
75 {};
76 
make_test4()77 void make_test4()
78 {
79     proto::terminal<int>::type i = {42};
80     int res = MakeTest4()(i);
81     BOOST_CHECK_EQUAL(res, 42);
82 }
83 
84 using namespace boost::unit_test;
85 ///////////////////////////////////////////////////////////////////////////////
86 // init_unit_test_suite
87 //
init_unit_test_suite(int argc,char * argv[])88 test_suite* init_unit_test_suite( int argc, char* argv[] )
89 {
90     test_suite *test = BOOST_TEST_SUITE("test the make transform");
91 
92     test->add(BOOST_TEST_CASE(&make_test1));
93     test->add(BOOST_TEST_CASE(&make_test2));
94     test->add(BOOST_TEST_CASE(&make_test3));
95     test->add(BOOST_TEST_CASE(&make_test4));
96 
97     return test;
98 }
99