]>
Commit | Line | Data |
---|---|---|
92f5a8d4 TL |
1 | // Copyright Daniel Wallin 2005. |
2 | // Copyright Cromwell D. Enage 2019. | |
3 | // Distributed under the Boost Software License, Version 1.0. | |
4 | // (See accompanying file LICENSE_1_0.txt or copy at | |
5 | // http://www.boost.org/LICENSE_1_0.txt) | |
7c673cae | 6 | |
92f5a8d4 | 7 | namespace test { |
7c673cae | 8 | |
92f5a8d4 TL |
9 | struct default_src |
10 | { | |
11 | typedef int result_type; | |
12 | ||
13 | int operator()() const | |
14 | { | |
15 | return 0; | |
16 | } | |
17 | }; | |
18 | } // namespace test | |
19 | ||
20 | #include <boost/parameter/name.hpp> | |
21 | ||
22 | namespace test { | |
23 | ||
24 | BOOST_PARAMETER_NAME(x) | |
25 | BOOST_PARAMETER_NAME(y) | |
26 | BOOST_PARAMETER_NAME(z) | |
27 | } // namespace test | |
28 | ||
29 | #include <boost/parameter/is_argument_pack.hpp> | |
30 | #include <boost/parameter/config.hpp> | |
31 | #include <boost/mpl/has_key.hpp> | |
32 | #include <boost/mpl/assert.hpp> | |
33 | #include <boost/core/lightweight_test.hpp> | |
34 | ||
35 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) | |
36 | #include <boost/mp11/map.hpp> | |
37 | #include <type_traits> | |
38 | #endif | |
39 | ||
40 | namespace test { | |
7c673cae | 41 | |
92f5a8d4 TL |
42 | template <typename ArgumentPack, typename K, typename T> |
43 | void check0(ArgumentPack const& p, K const& kw, T const& value) | |
7c673cae | 44 | { |
92f5a8d4 TL |
45 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
46 | static_assert( | |
47 | !boost::mp11::mp_map_contains<ArgumentPack,test::tag::z>::value | |
48 | , "test::tag::z must not be in ArgumentPack" | |
49 | ); | |
50 | static_assert( | |
51 | std::is_same< | |
52 | boost::mp11::mp_map_find<ArgumentPack,test::tag::z> | |
53 | , void | |
54 | >::value | |
55 | , "test::tag::z must not be found in ArgumentPack" | |
56 | ); | |
57 | #endif // BOOST_PARAMETER_CAN_USE_MP11 | |
58 | BOOST_MPL_ASSERT((boost::parameter::is_argument_pack<ArgumentPack>)); | |
59 | BOOST_MPL_ASSERT_NOT(( | |
60 | boost::mpl::has_key<ArgumentPack,test::tag::z> | |
61 | )); | |
62 | BOOST_TEST_EQ(p[kw], value); | |
7c673cae | 63 | } |
92f5a8d4 TL |
64 | } // namespace test |
65 | ||
66 | #include <boost/mpl/void.hpp> | |
67 | #include <boost/mpl/bool.hpp> | |
68 | #include <boost/mpl/int.hpp> | |
69 | #include <boost/mpl/if.hpp> | |
70 | #include <boost/mpl/key_type.hpp> | |
71 | #include <boost/mpl/order.hpp> | |
72 | #include <boost/mpl/count.hpp> | |
73 | #include <boost/mpl/equal_to.hpp> | |
74 | #include <boost/type_traits/is_same.hpp> | |
75 | ||
76 | namespace test { | |
77 | ||
78 | template <typename ArgumentPack, typename K, typename T> | |
79 | void check1(ArgumentPack const& p, K const& kw, T const& value) | |
80 | { | |
81 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) | |
82 | static_assert( | |
83 | boost::mp11::mp_map_contains<ArgumentPack,typename K::tag>::value | |
84 | , "typename K::tag must be in ArgumentPack" | |
85 | ); | |
86 | static_assert( | |
87 | !boost::mp11::mp_map_contains<ArgumentPack,test::tag::z>::value | |
88 | , "test::tag::z must not be in ArgumentPack" | |
89 | ); | |
90 | static_assert( | |
91 | !std::is_same< | |
92 | boost::mp11::mp_map_find<ArgumentPack,typename K::tag> | |
93 | , void | |
94 | >::value | |
95 | , "typename K::tag must be found in ArgumentPack" | |
96 | ); | |
97 | static_assert( | |
98 | std::is_same< | |
99 | boost::mp11::mp_map_find<ArgumentPack,test::tag::z> | |
100 | , void | |
101 | >::value | |
102 | , "test::tag::z must not be found in ArgumentPack" | |
103 | ); | |
104 | #endif // BOOST_PARAMETER_CAN_USE_MP11 | |
105 | BOOST_MPL_ASSERT((boost::parameter::is_argument_pack<ArgumentPack>)); | |
106 | BOOST_MPL_ASSERT((boost::mpl::has_key<ArgumentPack,typename K::tag>)); | |
107 | BOOST_MPL_ASSERT_NOT(( | |
108 | boost::mpl::has_key<ArgumentPack,test::tag::z> | |
109 | )); | |
110 | BOOST_MPL_ASSERT(( | |
111 | boost::mpl::equal_to< | |
112 | typename boost::mpl::count<ArgumentPack,typename K::tag>::type | |
113 | , boost::mpl::int_<1> | |
114 | > | |
115 | )); | |
116 | BOOST_MPL_ASSERT(( | |
117 | typename boost::mpl::if_< | |
118 | boost::is_same< | |
119 | typename boost::mpl | |
120 | ::key_type<ArgumentPack,typename K::tag>::type | |
121 | , typename K::tag | |
122 | > | |
123 | , boost::mpl::true_ | |
124 | , boost::mpl::false_ | |
125 | >::type | |
126 | )); | |
127 | BOOST_MPL_ASSERT(( | |
128 | typename boost::mpl::if_< | |
129 | boost::is_same< | |
130 | typename boost::mpl | |
131 | ::order<ArgumentPack,typename K::tag>::type | |
132 | , boost::mpl::void_ | |
133 | > | |
134 | , boost::mpl::false_ | |
135 | , boost::mpl::true_ | |
136 | >::type | |
137 | )); | |
138 | BOOST_TEST_EQ(p[kw], value); | |
139 | } | |
140 | } // namespace test | |
7c673cae FG |
141 | |
142 | int main() | |
143 | { | |
92f5a8d4 TL |
144 | test::check1(test::_x = 20, test::_x, 20); |
145 | test::check1(test::_y = 20, test::_y, 20); | |
146 | ||
147 | test::check0(test::_x = 20, test::_x | 0, 20); | |
148 | test::check0(test::_y = 20, test::_y | 0, 20); | |
149 | ||
150 | test::check0(test::_x = 20, test::_x || test::default_src(), 20); | |
151 | test::check0(test::_y = 20, test::_y || test::default_src(), 20); | |
7c673cae | 152 | |
92f5a8d4 TL |
153 | test::check0(test::_y = 20, test::_x | 0, 0); |
154 | test::check0(test::_y = 20, test::_x || test::default_src(), 0); | |
7c673cae | 155 | |
7c673cae FG |
156 | return boost::report_errors(); |
157 | } | |
158 |