1 // Copyright Louis Dionne 2013-2017
2 // Copyright Jason Rice 2017
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
5
6 #ifndef BOOST_HANA_TEST_AUTO_INDEX_IF_HPP
7 #define BOOST_HANA_TEST_AUTO_INDEX_IF_HPP
8
9 #include <boost/hana/assert.hpp>
10 #include <boost/hana/equal.hpp>
11 #include <boost/hana/index_if.hpp>
12 #include <boost/hana/integral_constant.hpp>
13 #include <boost/hana/optional.hpp>
14
15 #include "test_case.hpp"
16 #include <laws/base.hpp>
17 #include <support/tracked.hpp>
18
19
20 namespace _test_index_if_detail { template <int> struct invalid { }; }
21
22
__anonb019b87e0102null23 TestCase test_index_if{[]{
24 namespace hana = boost::hana;
25 using hana::test::ct_eq;
26 using _test_index_if_detail::invalid;
27
28 BOOST_HANA_CONSTANT_CHECK(hana::equal(
29 hana::index_if(MAKE_TUPLE(), hana::equal.to(ct_eq<0>{})),
30 hana::nothing
31 ));
32 BOOST_HANA_CONSTANT_CHECK(hana::equal(
33 hana::index_if(MAKE_TUPLE(ct_eq<0>{}), hana::equal.to(ct_eq<0>{})),
34 hana::just(hana::size_c<0>)
35 ));
36 BOOST_HANA_CONSTANT_CHECK(hana::equal(
37 hana::index_if(MAKE_TUPLE(ct_eq<0>{}), hana::equal.to(ct_eq<42>{})),
38 hana::nothing
39 ));
40 BOOST_HANA_CONSTANT_CHECK(hana::equal(
41 hana::index_if(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}), hana::equal.to(ct_eq<0>{})),
42 hana::just(hana::size_c<0>)
43 ));
44 BOOST_HANA_CONSTANT_CHECK(hana::equal(
45 hana::index_if(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}), hana::equal.to(ct_eq<1>{})),
46 hana::just(hana::size_c<1>)
47 ));
48 BOOST_HANA_CONSTANT_CHECK(hana::equal(
49 hana::index_if(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}), hana::equal.to(ct_eq<2>{})),
50 hana::just(hana::size_c<2>)
51 ));
52 BOOST_HANA_CONSTANT_CHECK(hana::equal(
53 hana::index_if(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}), hana::equal.to(ct_eq<42>{})),
54 hana::nothing
55 ));
56
57 #ifndef MAKE_TUPLE_NO_CONSTEXPR
58 auto type_equal = [](auto type) { return [=](auto&& value) {
59 return hana::equal(hana::typeid_(value), type);
60 };};
61
62 static_assert(decltype(hana::equal(
63 hana::index_if(MAKE_TUPLE(1, '2', 3.3), type_equal(hana::type_c<int>)),
64 hana::just(hana::size_c<0>)
65 )){}, "");
66 static_assert(decltype(hana::equal(
67 hana::index_if(MAKE_TUPLE(1, '2', 3.3), type_equal(hana::type_c<char>)),
68 hana::just(hana::size_c<1>)
69 )){}, "");
70 static_assert(decltype(hana::equal(
71 hana::index_if(MAKE_TUPLE(1, '2', 3.3), type_equal(hana::type_c<double>)),
72 hana::just(hana::size_c<2>)
73 )){}, "");
74 static_assert(decltype(hana::equal(
75 hana::index_if(MAKE_TUPLE(1, '2', 3.3), type_equal(hana::type_c<invalid<42>>)),
76 hana::nothing
77 )){}, "");
78 #endif
79 }};
80
81 #endif // !BOOST_HANA_TEST_AUTO_INDEX_IF_HPP
82