• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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