1 // Copyright Cromwell D. Enage 2017.
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/config.hpp>
7 
8 #if (BOOST_PARAMETER_MAX_ARITY < 16)
9 #error Define BOOST_PARAMETER_MAX_ARITY as 16 or greater.
10 #endif
11 
12 #include <boost/parameter/name.hpp>
13 
14 namespace test {
15 
16     BOOST_PARAMETER_NAME((_lrc0, keywords) in(lrc0))
17     BOOST_PARAMETER_NAME((_lr1, keywords) out(lr1))
18     BOOST_PARAMETER_NAME((_lr2, keywords) out(lr2))
19     BOOST_PARAMETER_NAME((_lrc3, keywords) in(lrc3))
20     BOOST_PARAMETER_NAME((_lrc4, keywords) in(lrc4))
21     BOOST_PARAMETER_NAME((_lr5, keywords) out(lr5))
22     BOOST_PARAMETER_NAME((_lr6, keywords) out(lr6))
23     BOOST_PARAMETER_NAME((_lrc7, keywords) in(lrc7))
24     BOOST_PARAMETER_NAME((_rrc0, keywords) in(rrc0))
25     BOOST_PARAMETER_NAME((_rrc1, keywords) in(rrc1))
26     BOOST_PARAMETER_NAME((_rrc2, keywords) in(rrc2))
27     BOOST_PARAMETER_NAME((_rrc3, keywords) in(rrc3))
28     BOOST_PARAMETER_NAME((_rrc4, keywords) in(rrc4))
29     BOOST_PARAMETER_NAME((_rrc5, keywords) in(rrc5))
30     BOOST_PARAMETER_NAME((_rrc6, keywords) in(rrc6))
31     BOOST_PARAMETER_NAME((_rrc7, keywords) in(rrc7))
32 } // namespace test
33 
34 #include <boost/parameter/parameters.hpp>
35 #include <boost/parameter/required.hpp>
36 #include <boost/parameter/optional.hpp>
37 
38 namespace test {
39 
40     struct h_parameters
41       : boost::parameter::parameters<
42             boost::parameter::required<test::keywords::lrc0>
43           , boost::parameter::required<test::keywords::rrc0>
44           , boost::parameter::required<test::keywords::lr1>
45           , boost::parameter::required<test::keywords::rrc1>
46           , boost::parameter::required<test::keywords::lr2>
47           , boost::parameter::required<test::keywords::rrc2>
48           , boost::parameter::required<test::keywords::lrc3>
49           , boost::parameter::required<test::keywords::rrc3>
50           , boost::parameter::optional<test::keywords::lrc4>
51           , boost::parameter::optional<test::keywords::rrc4>
52           , boost::parameter::optional<test::keywords::lr5>
53           , boost::parameter::optional<test::keywords::rrc5>
54           , boost::parameter::optional<test::keywords::lr6>
55           , boost::parameter::optional<test::keywords::rrc6>
56           , boost::parameter::optional<test::keywords::lrc7>
57           , boost::parameter::optional<test::keywords::rrc7>
58         >
59     {
60     };
61 } // namespace test
62 
63 #include <boost/core/lightweight_test.hpp>
64 #include "evaluate_category.hpp"
65 
66 namespace test {
67 
68     struct D
69     {
70         template <typename Args>
evaluatetest::D71         static void evaluate(Args const& args)
72         {
73             BOOST_TEST_EQ(
74                 test::passed_by_lvalue_reference_to_const
75               , test::U::evaluate_category<0>(args[test::_lrc0])
76             );
77             BOOST_TEST_EQ(
78                 test::passed_by_lvalue_reference
79               , test::U::evaluate_category<1>(args[test::_lr1])
80             );
81             BOOST_TEST_EQ(
82                 test::passed_by_lvalue_reference
83               , test::U::evaluate_category<2>(args[test::_lr2])
84             );
85             BOOST_TEST_EQ(
86                 test::passed_by_lvalue_reference_to_const
87               , test::U::evaluate_category<3>(args[test::_lrc3])
88             );
89             BOOST_TEST_EQ(
90                 test::passed_by_lvalue_reference_to_const
91               , test::U::evaluate_category<4>(
92                     args[test::_lrc4 | test::lvalue_const_bitset<4>()]
93                 )
94             );
95             BOOST_TEST_EQ(
96                 test::passed_by_lvalue_reference
97               , test::U::evaluate_category<5>(
98                     args[
99                         test::_lr5 || test::lvalue_bitset_function<5>()
100                     ]
101                 )
102             );
103             BOOST_TEST_EQ(
104                 test::passed_by_lvalue_reference
105               , test::U::evaluate_category<6>(
106                     args[test::_lr6 | test::lvalue_bitset<6>()]
107                 )
108             );
109             BOOST_TEST_EQ(
110                 test::passed_by_lvalue_reference_to_const
111               , test::U::evaluate_category<7>(
112                     args[
113                         test::_lrc7 || test::lvalue_const_bitset_function<7>()
114                     ]
115                 )
116             );
117 #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
118             BOOST_TEST_EQ(
119                 test::passed_by_rvalue_reference_to_const
120               , test::U::evaluate_category<0>(args[test::_rrc0])
121             );
122             BOOST_TEST_EQ(
123                 test::passed_by_rvalue_reference_to_const
124               , test::U::evaluate_category<1>(args[test::_rrc1])
125             );
126             BOOST_TEST_EQ(
127                 test::passed_by_rvalue_reference_to_const
128               , test::U::evaluate_category<2>(args[test::_rrc2])
129             );
130             BOOST_TEST_EQ(
131                 test::passed_by_rvalue_reference_to_const
132               , test::U::evaluate_category<3>(args[test::_rrc3])
133             );
134             BOOST_TEST_EQ(
135                 test::passed_by_rvalue_reference_to_const
136               , test::U::evaluate_category<4>(
137                     args[test::_rrc4 | test::rvalue_const_bitset<4>()]
138                 )
139             );
140             BOOST_TEST_EQ(
141                 test::passed_by_rvalue_reference_to_const
142               , test::U::evaluate_category<5>(
143                     args[
144                         test::_rrc5 || test::rvalue_const_bitset_function<5>()
145                     ]
146                 )
147             );
148             BOOST_TEST_EQ(
149                 test::passed_by_rvalue_reference_to_const
150               , test::U::evaluate_category<6>(
151                     args[test::_rrc6 | test::rvalue_const_bitset<6>()]
152                 )
153             );
154             BOOST_TEST_EQ(
155                 test::passed_by_rvalue_reference_to_const
156               , test::U::evaluate_category<7>(
157                     args[
158                         test::_rrc7 || test::rvalue_const_bitset_function<7>()
159                     ]
160                 )
161             );
162 #else   // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
163             BOOST_TEST_EQ(
164                 test::passed_by_lvalue_reference_to_const
165               , test::U::evaluate_category<0>(args[test::_rrc0])
166             );
167             BOOST_TEST_EQ(
168                 test::passed_by_lvalue_reference_to_const
169               , test::U::evaluate_category<1>(args[test::_rrc1])
170             );
171             BOOST_TEST_EQ(
172                 test::passed_by_lvalue_reference_to_const
173               , test::U::evaluate_category<2>(args[test::_rrc2])
174             );
175             BOOST_TEST_EQ(
176                 test::passed_by_lvalue_reference_to_const
177               , test::U::evaluate_category<3>(args[test::_rrc3])
178             );
179             BOOST_TEST_EQ(
180                 test::passed_by_lvalue_reference_to_const
181               , test::U::evaluate_category<4>(
182                     args[test::_rrc4 | test::rvalue_const_bitset<4>()]
183                 )
184             );
185             BOOST_TEST_EQ(
186                 test::passed_by_lvalue_reference_to_const
187               , test::U::evaluate_category<5>(
188                     args[
189                         test::_rrc5 || test::rvalue_const_bitset_function<5>()
190                     ]
191                 )
192             );
193             BOOST_TEST_EQ(
194                 test::passed_by_lvalue_reference_to_const
195               , test::U::evaluate_category<6>(
196                     args[test::_rrc6 | test::rvalue_const_bitset<6>()]
197                 )
198             );
199             BOOST_TEST_EQ(
200                 test::passed_by_lvalue_reference_to_const
201               , test::U::evaluate_category<7>(
202                     args[
203                         test::_rrc7 || test::rvalue_const_bitset_function<7>()
204                     ]
205                 )
206             );
207 #endif  // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
208         }
209     };
210 } // namespace test
211 
main()212 int main()
213 {
214     test::D::evaluate(
215         test::h_parameters()(
216             test::lvalue_const_bitset<0>()
217           , test::rvalue_const_bitset<0>()
218           , test::lvalue_bitset<1>()
219           , test::rvalue_const_bitset<1>()
220           , test::lvalue_bitset<2>()
221           , test::rvalue_const_bitset<2>()
222           , test::lvalue_const_bitset<3>()
223           , test::rvalue_const_bitset<3>()
224         )
225     );
226     test::D::evaluate(
227         test::h_parameters()(
228             test::lvalue_const_bitset<0>()
229           , test::rvalue_const_bitset<0>()
230           , test::lvalue_bitset<1>()
231           , test::rvalue_const_bitset<1>()
232           , test::lvalue_bitset<2>()
233           , test::rvalue_const_bitset<2>()
234           , test::lvalue_const_bitset<3>()
235           , test::rvalue_const_bitset<3>()
236           , test::lvalue_const_bitset<4>()
237           , test::rvalue_const_bitset<4>()
238           , test::lvalue_bitset<5>()
239           , test::rvalue_const_bitset<5>()
240           , test::lvalue_bitset<6>()
241           , test::rvalue_const_bitset<6>()
242           , test::lvalue_const_bitset<7>()
243           , test::rvalue_const_bitset<7>()
244         )
245     );
246     return boost::report_errors();
247 }
248 
249