MPL11
 All Classes Namespaces Files Typedefs Macros Groups Pages
iterable.hpp
Go to the documentation of this file.
1 
12 #ifndef BOOST_MPL11_DETAIL_TEST_ITERABLE_HPP
13 #define BOOST_MPL11_DETAIL_TEST_ITERABLE_HPP
14 
15 #include <boost/mpl11/iterable.hpp>
16 
17 #include <boost/mpl11/core.hpp>
21 #include <boost/mpl11/integer.hpp>
22 #include <boost/mpl11/logical.hpp>
23 
24 
25 #define static_assert_(...) static_assert(__VA_ARGS__, # __VA_ARGS__)
26 
27 namespace boost { namespace mpl11 { namespace detail {
28 namespace iterable_detail {
29 template <typename ...x>
30 struct f { using type = f<typename x::type...>; };
31 
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; };
37 
38 using u = undefined;
39 
40 template <template <typename ...> class s>
41 struct test_head
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>
46 { };
47 
48 template <template <typename ...> class s>
49 struct test_tail
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>>
54 { };
55 
56 template <template <typename ...> class structure>
57 struct test_is_empty {
58  static_assert_( is_empty<structure<>>::value);
59  static_assert_(!is_empty<structure<u>>::value);
60  static_assert_(!is_empty<structure<u, u>>::value);
61 };
62 
63 template <template <typename ...> class s>
64 struct test_last
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>
70 { };
71 
72 template <template <typename ...> class s>
73 struct test_at
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>
78 
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>
82 
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>
85 
86  , expect<at_c<3, s<x0, x1, x2, x3>>>::template to_eq<x3>
87 { };
88 
89 template <template <typename ...> class structure>
90 struct test_length {
91  static_assert_(length<structure<>>::value == 0);
92  static_assert_(length<structure<u>>::value == 1);
93  static_assert_(length<structure<u, u>>::value == 2);
94  static_assert_(length<structure<u, u, u>>::value == 3);
95  static_assert_(length<structure<u, u, u, u>>::value == 4);
96 };
97 
98 template <template <typename ...> class s>
99 struct test_drop
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<>>
104 
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<>>
109 
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<>>
114 
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<>>
121 
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<>>
128 { };
129 
130 template <template <typename ...> class structure>
131 struct test_drop_while {
132  template <int ...xs>
133  using s = structure<int_<xs>...>;
134 
135  template <int ...xs>
136  using dlz = drop_while<lift<not_>, s<xs...>>;
137 
138  struct go
139  : expect<dlz<>>::template to_eq<s<>>
140 
141  , expect<dlz<0>>::template to_eq<s<>>
142  , expect<dlz<1>>::template to_eq<s<1>>
143 
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>>
148 
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>>
157  { };
158 
159  static_assert_(sizeof(go));
160 };
161 
162 template <template <typename ...> class structure>
163 struct test_drop_until {
164  // Tested by drop_while
165 };
166 
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>>
173 
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>>
178 
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>>
183 
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>>
188 { };
189 
190 template <template <typename ...> class structure>
191 struct test_orderable {
192  template <int ...xs>
193  using s = structure<int_<xs>...>;
194 
195  template <typename x, typename y>
196  struct _less
197  : expect<x>::to::template be_<less>::template than<y>
198  , expect<x>::to::template be_<less_equal>::template than<y>
199  { };
200 
201  struct go
202  : _less<s<>, s<0>>
203  , _less<s<>, s<0, 1>>
204  , _less<s<>, s<0, 1, 2>>
205  , _less<s<>, s<0, 1, 2, 3>>
206 
207  , _less<s<0>, s<1>>
208  , _less<s<0>, s<0, 0>>
209  , _less<s<0>, s<0, 1>>
210 
211  , _less<s<0, 1>, s<1, 0>>
212  , _less<s<0, 1>, s<0, 2>>
213 
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>>
217  { };
218 
219  static_assert_(sizeof(go));
220 };
221 
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>>;
228 
230  sizeof(_datatype<>) +
231  sizeof(_datatype<u>) +
232  sizeof(_datatype<u, u>) +
233  sizeof(_datatype<u, u, u>)
234  );
235 };
236 } // end namespace iterable_detail
237 
238 template <template <typename ...> class structure>
239 struct test_Iterable
240  : test_Foldable<structure>
241 
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>
251 
252  , iterable_detail::test_comparable<structure>
253  , iterable_detail::test_orderable<structure>
254 
255  , iterable_detail::test_datatype<structure>
256 { };
257 }}} // end namespace boost::mpl11::detail
258 
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.
Defines the Core 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.