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