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) |
6 | |
7 | namespace test { |
8 | |
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 { |
41 | |
42 | template <typename ArgumentPack, typename K, typename T> |
43 | void check0(ArgumentPack const& p, K const& kw, T const& value) |
44 | { |
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); |
63 | } |
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 |
141 | |
142 | int main() |
143 | { |
144 | test::check1(p: test::_x = 20, kw: test::_x, value: 20); |
145 | test::check1(p: test::_y = 20, kw: test::_y, value: 20); |
146 | |
147 | test::check0(p: test::_x = 20, kw: test::_x | 0, value: 20); |
148 | test::check0(p: test::_y = 20, kw: test::_y | 0, value: 20); |
149 | |
150 | test::check0(p: test::_x = 20, kw: test::_x || test::default_src(), value: 20); |
151 | test::check0(p: test::_y = 20, kw: test::_y || test::default_src(), value: 20); |
152 | |
153 | test::check0(p: test::_y = 20, kw: test::_x | 0, value: 0); |
154 | test::check0(p: test::_y = 20, kw: test::_x || test::default_src(), value: 0); |
155 | |
156 | return boost::report_errors(); |
157 | } |
158 | |
159 | |