at.hpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright Louis Dionne 2013-2017
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  4. #ifndef BOOST_HANA_TEST_AUTO_AT_HPP
  5. #define BOOST_HANA_TEST_AUTO_AT_HPP
  6. #include <boost/hana/assert.hpp>
  7. #include <boost/hana/at.hpp>
  8. #include <boost/hana/equal.hpp>
  9. #include <boost/hana/integral_constant.hpp>
  10. #include "test_case.hpp"
  11. #include <laws/base.hpp>
  12. #include <support/tracked.hpp>
  13. namespace _test_at_detail { template <int> struct invalid { }; }
  14. TestCase test_at{[]{
  15. namespace hana = boost::hana;
  16. using hana::test::ct_eq;
  17. using _test_at_detail::invalid;
  18. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  19. hana::at(MAKE_TUPLE(ct_eq<0>{}), hana::size_c<0>),
  20. ct_eq<0>{}
  21. ));
  22. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  23. hana::at(MAKE_TUPLE(ct_eq<0>{}, invalid<1>{}), hana::size_c<0>),
  24. ct_eq<0>{}
  25. ));
  26. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  27. hana::at(MAKE_TUPLE(invalid<0>{}, ct_eq<1>{}), hana::size_c<1>),
  28. ct_eq<1>{}
  29. ));
  30. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  31. hana::at(MAKE_TUPLE(invalid<0>{}, ct_eq<1>{}, invalid<2>{}), hana::size_c<1>),
  32. ct_eq<1>{}
  33. ));
  34. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  35. hana::at(MAKE_TUPLE(invalid<0>{}, invalid<1>{}, ct_eq<2>{}), hana::size_c<2>),
  36. ct_eq<2>{}
  37. ));
  38. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  39. hana::at(MAKE_TUPLE(invalid<0>{}, invalid<1>{}, ct_eq<2>{}, invalid<3>{}), hana::size_c<2>),
  40. ct_eq<2>{}
  41. ));
  42. #ifndef MAKE_TUPLE_NO_CONSTEXPR
  43. static_assert(hana::equal(
  44. hana::at(MAKE_TUPLE(1), hana::size_c<0>),
  45. 1
  46. ), "");
  47. static_assert(hana::equal(
  48. hana::at(MAKE_TUPLE(1, '2'), hana::size_c<0>),
  49. 1
  50. ), "");
  51. static_assert(hana::equal(
  52. hana::at(MAKE_TUPLE(1, '2', 3.3), hana::size_c<0>),
  53. 1
  54. ), "");
  55. static_assert(hana::equal(
  56. hana::at(MAKE_TUPLE(1, '2'), hana::size_c<1>),
  57. '2'
  58. ), "");
  59. static_assert(hana::equal(
  60. hana::at(MAKE_TUPLE(1, '2', 3.3), hana::size_c<1>),
  61. '2'
  62. ), "");
  63. static_assert(hana::equal(
  64. hana::at(MAKE_TUPLE(1, '2', 3.3), hana::size_c<2>),
  65. 3.3
  66. ), "");
  67. #endif
  68. // make sure we can use non-pods on both sides
  69. {
  70. // store the result to make sure `at` is executed.
  71. auto result = hana::at(MAKE_TUPLE(Tracked{0}, ct_eq<1>{}, Tracked{1}), hana::size_c<1>);;
  72. BOOST_HANA_CONSTANT_CHECK(hana::equal(result, ct_eq<1>{}));
  73. }
  74. }};
  75. #endif // !BOOST_HANA_TEST_AUTO_AT_HPP