• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright Daniel Wallin 2006.
2 // Distributed under the Boost Software License, Version 1.0.
3 // (See accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
5 
6 #include <boost/parameter/parameters.hpp>
7 #include <boost/parameter/name.hpp>
8 #include <boost/parameter/binding.hpp>
9 #include <boost/parameter/config.hpp>
10 #include "deduced.hpp"
11 
12 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
13 #include <type_traits>
14 #else
15 #include <boost/mpl/bool.hpp>
16 #include <boost/mpl/if.hpp>
17 #include <boost/type_traits/is_convertible.hpp>
18 #endif
19 
20 #if defined(LIBS_PARAMETER_TEST_COMPILE_FAILURE)
21 #include <boost/parameter/aux_/preprocessor/nullptr.hpp>
22 #endif
23 
24 namespace test {
25 
26     BOOST_PARAMETER_NAME(x)
27     BOOST_PARAMETER_NAME(y)
28     BOOST_PARAMETER_NAME(z)
29 
30     template <typename To>
31     struct predicate
32     {
33         template <typename From, typename Args>
34 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
35         using fn = std::is_convertible<From,To>;
36 #else
37         struct apply
38           : boost::mpl::if_<
39                 boost::is_convertible<From,To>
40               , boost::mpl::true_
41               , boost::mpl::false_
42             >
43         {
44         };
45 #endif
46     };
47 } // namespace test
48 
49 #include <boost/core/lightweight_test.hpp>
50 #include <string>
51 
main()52 int main()
53 {
54     test::check<
55         boost::parameter::parameters<test::tag::x,test::tag::y>
56     >((test::_x = 0, test::_y = 1), 0, 1);
57 
58     test::check<
59         boost::parameter::parameters<
60             test::tag::x
61           , boost::parameter::required<
62                 boost::parameter::deduced<test::tag::y>
63               , test::predicate<int>
64             >
65           , boost::parameter::optional<
66                 boost::parameter::deduced<test::tag::z>
67               , test::predicate<std::string>
68             >
69         >
70     >(
71         (
72             test::_x = 0
73           , test::_y = test::not_present
74           , test::_z = std::string("foo")
75         )
76       , test::_x = 0
77       , std::string("foo")
78     );
79 
80     test::check<
81         boost::parameter::parameters<
82             test::tag::x
83           , boost::parameter::required<
84                 boost::parameter::deduced<test::tag::y>
85               , test::predicate<int>
86             >
87           , boost::parameter::optional<
88                 boost::parameter::deduced<test::tag::z>
89               , test::predicate<std::string>
90             >
91         >
92     >(
93         (test::_x = 0, test::_y = 1, test::_z = std::string("foo"))
94       , 0
95       , std::string("foo")
96       , 1
97     );
98 
99     test::check<
100         boost::parameter::parameters<
101             test::tag::x
102           , boost::parameter::required<
103                 boost::parameter::deduced<test::tag::y>
104               , test::predicate<int>
105             >
106           , boost::parameter::optional<
107                 boost::parameter::deduced<test::tag::z>
108               , test::predicate<std::string>
109             >
110         >
111     >(
112         (test::_x = 0, test::_y = 1, test::_z = std::string("foo"))
113       , 0
114       , 1
115       , std::string("foo")
116     );
117 
118     test::check<
119         boost::parameter::parameters<
120             test::tag::x
121           , boost::parameter::required<
122                 boost::parameter::deduced<test::tag::y>
123               , test::predicate<int>
124             >
125           , boost::parameter::optional<
126                 boost::parameter::deduced<test::tag::z>
127               , test::predicate<std::string>
128             >
129         >
130     >(
131         (test::_x = 0, test::_y = 1, test::_z = std::string("foo"))
132       , 0
133       , test::_y = 1
134       , std::string("foo")
135     );
136 
137     test::check<
138         boost::parameter::parameters<
139             test::tag::x
140           , boost::parameter::required<
141                 boost::parameter::deduced<test::tag::y>
142               , test::predicate<int>
143             >
144           , boost::parameter::optional<
145                 boost::parameter::deduced<test::tag::z>
146               , test::predicate<std::string>
147             >
148         >
149     >(
150         (test::_x = 0, test::_y = 1, test::_z = std::string("foo"))
151       , test::_z = std::string("foo")
152       , test::_x = 0
153       , 1
154     );
155 
156 #if defined(LIBS_PARAMETER_TEST_COMPILE_FAILURE)
157     // Fails because boost::parameter::aux::make_arg_list<> evaluates
158     // boost::parameter::aux::is_named_argument<> to boost::mpl::false_
159     // for static_cast<long*>(BOOST_PARAMETER_AUX_PP_NULLPTR).
160     test::check<
161         boost::parameter::parameters<
162             test::tag::x
163           , boost::parameter::required<
164                 boost::parameter::deduced<test::tag::y>
165               , test::predicate<int>
166             >
167           , boost::parameter::optional<
168                 boost::parameter::deduced<test::tag::z>
169               , test::predicate<std::string>
170             >
171         >
172     >(
173         (test::_x = 0, test::_y = 1, test::_z = std::string("foo"))
174       , test::_x = 0
175       , static_cast<long*>(BOOST_PARAMETER_AUX_PP_NULLPTR)
176       , 1
177     );
178 #endif
179 
180     return boost::report_errors();
181 }
182 
183