12 #ifndef BOOST_MPL11_DETAIL_TEST_ITERABLE_HPP
13 #define BOOST_MPL11_DETAIL_TEST_ITERABLE_HPP
25 #define static_assert_(...) static_assert(__VA_ARGS__, # __VA_ARGS__)
27 namespace boost {
namespace mpl11 {
namespace detail {
28 namespace iterable_detail {
29 template <
typename ...x>
30 struct f {
using type = f<
typename x::type...>; };
32 struct x {
using type = x; };
33 struct x0 {
using type = x0; };
34 struct x1 {
using type = x1; };
35 struct x2 {
using type = x2; };
36 struct x3 {
using type = x3; };
40 template <
template <
typename ...>
class s>
42 : expect<head<s<x>>>::template to_eq<x>
43 , expect<head<s<x, u>>>::template to_eq<x>
44 , expect<head<s<x, u, u>>>::template to_eq<x>
45 , expect<head<s<x, u, u, u>>>::template to_eq<x>
48 template <
template <
typename ...>
class s>
50 : expect<tail<s<x0>>>::template to_eq<s<>>
51 , expect<tail<s<x0, x1>>>::template to_eq<s<x1>>
52 , expect<tail<s<x0, x1, x2>>>::template to_eq<s<x1, x2>>
53 , expect<tail<s<x0, x1, x2, x3>>>::template to_eq<s<x1, x2, x3>>
56 template <
template <
typename ...>
class structure>
57 struct test_is_empty {
63 template <
template <
typename ...>
class s>
65 : expect<last<s<x>>>::template to_eq<x>
66 , expect<last<s<u, x>>>::template to_eq<x>
67 , expect<last<s<u, u, x>>>::template to_eq<x>
68 , expect<last<s<u, u, u, x>>>::template to_eq<x>
69 , expect<last<s<u, u, u, u, x>>>::template to_eq<x>
72 template <
template <
typename ...>
class s>
74 : expect<at_c<0, s<x0>>>::template to_eq<x0>
75 , expect<at_c<0, s<x0, x1>>>::template to_eq<x0>
76 , expect<at_c<0, s<x0, x1, x2>>>::template to_eq<x0>
77 , expect<at_c<0, s<x0, x1, x2, x3>>>::template to_eq<x0>
79 , expect<at_c<1, s<x0, x1>>>::template to_eq<x1>
80 , expect<at_c<1, s<x0, x1, x2>>>::template to_eq<x1>
81 , expect<at_c<1, s<x0, x1, x2, x3>>>::template to_eq<x1>
83 , expect<at_c<2, s<x0, x1, x2>>>::template to_eq<x2>
84 , expect<at_c<2, s<x0, x1, x2, x3>>>::template to_eq<x2>
86 , expect<at_c<3, s<x0, x1, x2, x3>>>::template to_eq<x3>
89 template <
template <
typename ...>
class structure>
98 template <
template <
typename ...>
class s>
100 : expect<drop_c<0, s<>>>::template to_eq<s<>>
101 , expect<drop_c<1, s<>>>::template to_eq<s<>>
102 , expect<drop_c<2, s<>>>::template to_eq<s<>>
103 , expect<drop_c<3, s<>>>::template to_eq<s<>>
105 , expect<drop_c<0, s<x0>>>::template to_eq<s<x0>>
106 , expect<drop_c<1, s<x0>>>::template to_eq<s<>>
107 , expect<drop_c<2, s<x0>>>::template to_eq<s<>>
108 , expect<drop_c<3, s<x0>>>::template to_eq<s<>>
110 , expect<drop_c<0, s<x0, x1>>>::template to_eq<s<x0, x1>>
111 , expect<drop_c<1, s<x0, x1>>>::template to_eq<s<x1>>
112 , expect<drop_c<2, s<x0, x1>>>::template to_eq<s<>>
113 , expect<drop_c<3, s<x0, x1>>>::template to_eq<s<>>
115 , expect<drop_c<0, s<x0, x1, x2>>>::template to_eq<s<x0, x1, x2>>
116 , expect<drop_c<1, s<x0, x1, x2>>>::template to_eq<s<x1, x2>>
117 , expect<drop_c<2, s<x0, x1, x2>>>::template to_eq<s<x2>>
118 , expect<drop_c<3, s<x0, x1, x2>>>::template to_eq<s<>>
119 , expect<drop_c<4, s<x0, x1, x2>>>::template to_eq<s<>>
120 , expect<drop_c<5, s<x0, x1, x2>>>::template to_eq<s<>>
122 , expect<drop_c<0, s<x0, x1, x2, x3>>>::template to_eq<s<x0, x1, x2, x3>>
123 , expect<drop_c<1, s<x0, x1, x2, x3>>>::template to_eq<s<x1, x2, x3>>
124 , expect<drop_c<2, s<x0, x1, x2, x3>>>::template to_eq<s<x2, x3>>
125 , expect<drop_c<3, s<x0, x1, x2, x3>>>::template to_eq<s<x3>>
126 , expect<drop_c<4, s<x0, x1, x2, x3>>>::template to_eq<s<>>
127 , expect<drop_c<5, s<x0, x1, x2, x3>>>::template to_eq<s<>>
130 template <
template <
typename ...>
class structure>
131 struct test_drop_while {
133 using s = structure<int_<xs>...>;
136 using dlz = drop_while<lift<not_>, s<xs...>>;
139 : expect<dlz<>>::template to_eq<s<>>
141 , expect<dlz<0>>::template to_eq<s<>>
142 , expect<dlz<1>>::template to_eq<s<1>>
144 , expect<dlz<0, 0>>::template to_eq<s<>>
145 , expect<dlz<0, 2>>::template to_eq<s<2>>
146 , expect<dlz<1, 0>>::template to_eq<s<1, 0>>
147 , expect<dlz<1, 2>>::template to_eq<s<1, 2>>
149 , expect<dlz<0, 0, 0>>::template to_eq<s<>>
150 , expect<dlz<0, 0, 3>>::template to_eq<s<3>>
151 , expect<dlz<0, 2, 0>>::template to_eq<s<2, 0>>
152 , expect<dlz<0, 2, 3>>::template to_eq<s<2, 3>>
153 , expect<dlz<1, 0, 0>>::template to_eq<s<1, 0, 0>>
154 , expect<dlz<1, 0, 3>>::template to_eq<s<1, 0, 3>>
155 , expect<dlz<1, 2, 0>>::template to_eq<s<1, 2, 0>>
156 , expect<dlz<1, 2, 3>>::template to_eq<s<1, 2, 3>>
162 template <
template <
typename ...>
class structure>
163 struct test_drop_until {
167 template <
template <
typename ...>
class s>
168 struct test_comparable
169 : expect<s<>>:: to::template eq<s<>>
170 , expect<s<>>::not_to::template eq<s<x0>>
171 , expect<s<>>::not_to::template eq<s<x0, x1>>
172 , expect<s<>>::not_to::template eq<s<x0, x1, x2>>
174 , expect<s<x0>>::not_to::template eq<s<>>
175 , expect<s<x0>>:: to::template eq<s<x0>>
176 , expect<s<x0>>::not_to::template eq<s<x0, x1>>
177 , expect<s<x0>>::not_to::template eq<s<x0, x1, x2>>
179 , expect<s<x0, x1>>::not_to::template eq<s<>>
180 , expect<s<x0, x1>>::not_to::template eq<s<x0>>
181 , expect<s<x0, x1>>:: to::template eq<s<x0, x1>>
182 , expect<s<x0, x1>>::not_to::template eq<s<x0, x1, x2>>
184 , expect<s<x0, x1, x2>>::not_to::template eq<s<>>
185 , expect<s<x0, x1, x2>>::not_to::template eq<s<x0>>
186 , expect<s<x0, x1, x2>>::not_to::template eq<s<x0, x1>>
187 , expect<s<x0, x1, x2>>:: to::template eq<s<x0, x1, x2>>
190 template <
template <
typename ...>
class structure>
191 struct test_orderable {
193 using s = structure<int_<xs>...>;
195 template <
typename x,
typename y>
197 : expect<x>::to::template be_<less>::template than<y>
198 , expect<x>::to::template be_<less_equal>::template than<y>
203 , _less<s<>, s<0, 1>>
204 , _less<s<>, s<0, 1, 2>>
205 , _less<s<>, s<0, 1, 2, 3>>
208 , _less<s<0>, s<0, 0>>
209 , _less<s<0>, s<0, 1>>
211 , _less<s<0, 1>, s<1, 0>>
212 , _less<s<0, 1>, s<0, 2>>
214 , _less<s<0, 1, 2>, s<0, 1, 3>>
215 , _less<s<0, 1, 2>, s<0, 2>>
216 , _less<s<0, 1, 2>, s<1>>
222 template <
template <
typename ...>
class structure>
223 struct test_datatype {
224 template <
typename ...xs>
225 using _datatype =
typename expect<
226 typename datatype<
typename structure<xs...>::type>::type
227 >::template to_satisfy<lift<mpl11::Iterable>>;
230 sizeof(_datatype<>) +
231 sizeof(_datatype<u>) +
232 sizeof(_datatype<u, u>) +
233 sizeof(_datatype<u, u, u>)
238 template <
template <
typename ...>
class structure>
240 : test_Foldable<structure>
242 , iterable_detail::test_head<structure>
243 , iterable_detail::test_tail<structure>
244 , iterable_detail::test_is_empty<structure>
245 , iterable_detail::test_last<structure>
246 , iterable_detail::test_at<structure>
247 , iterable_detail::test_length<structure>
248 , iterable_detail::test_drop<structure>
249 , iterable_detail::test_drop_while<structure>
250 , iterable_detail::test_drop_until<structure>
252 , iterable_detail::test_comparable<structure>
253 , iterable_detail::test_orderable<structure>
255 , iterable_detail::test_datatype<structure>
259 #endif // !BOOST_MPL11_DETAIL_TEST_ITERABLE_HPP
Defines the Integer datatype.
Defines the Iterable typeclass.
Defines unit tests for Foldables.
Defines the Logical module.
Returns the given boolean expression and statically asserts that its value is true.
Definition: static_assert.hpp:22
Defines utilities to write unit tests.
Defines the Functional module.