at_key.ref.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. #include <boost/hana/assert.hpp>
  5. #include <boost/hana/at_key.hpp>
  6. #include <boost/hana/integral_constant.hpp>
  7. #include <boost/hana/map.hpp>
  8. #include <boost/hana/pair.hpp>
  9. #include <utility>
  10. namespace hana = boost::hana;
  11. template <typename T>
  12. T const& cref(T& t) { return t; }
  13. int main() {
  14. // using at_key
  15. {
  16. auto xs = hana::make_map(
  17. hana::make_pair(hana::int_c<0>, 0),
  18. hana::make_pair(hana::int_c<1>, '1'),
  19. hana::make_pair(hana::int_c<2>, 2.2)
  20. );
  21. // Make sure we return lvalue-references
  22. BOOST_HANA_RUNTIME_CHECK(hana::at_key(xs, hana::int_c<0>) == 0);
  23. BOOST_HANA_RUNTIME_CHECK(hana::at_key(xs, hana::int_c<1>) == '1');
  24. BOOST_HANA_RUNTIME_CHECK(hana::at_key(xs, hana::int_c<2>) == 2.2);
  25. int& a = hana::at_key(xs, hana::int_c<0>);
  26. char& b = hana::at_key(xs, hana::int_c<1>);
  27. double& c = hana::at_key(xs, hana::int_c<2>);
  28. a = 9;
  29. b = '9';
  30. c = 9.9;
  31. // Make sure we return lvalue-references to const on a const map
  32. int const& ca = hana::at_key(cref(xs), hana::int_c<0>);
  33. char const& cb = hana::at_key(cref(xs), hana::int_c<1>);
  34. double const& cc = hana::at_key(cref(xs), hana::int_c<2>);
  35. BOOST_HANA_RUNTIME_CHECK(ca == 9);
  36. BOOST_HANA_RUNTIME_CHECK(cb == '9');
  37. BOOST_HANA_RUNTIME_CHECK(cc == 9.9);
  38. }
  39. // using operator[]
  40. {
  41. auto xs = hana::make_map(
  42. hana::make_pair(hana::int_c<0>, 0),
  43. hana::make_pair(hana::int_c<1>, '1'),
  44. hana::make_pair(hana::int_c<2>, 2.2)
  45. );
  46. BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<0>] == 0);
  47. BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<1>] == '1');
  48. BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<2>] == 2.2);
  49. xs[hana::int_c<0>] = 9;
  50. xs[hana::int_c<1>] = '9';
  51. xs[hana::int_c<2>] = 9.9;
  52. BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<0>] == 9);
  53. BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<1>] == '9');
  54. BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<2>] == 9.9);
  55. }
  56. // Make sure we return a rvalue-reference from a temporary map
  57. // (https://github.com/boostorg/hana/issues/90)
  58. {
  59. auto xs = hana::make_map(
  60. hana::make_pair(hana::int_c<0>, 0),
  61. hana::make_pair(hana::int_c<1>, '1'),
  62. hana::make_pair(hana::int_c<2>, 2.2)
  63. );
  64. char&& c = hana::at_key(std::move(xs), hana::int_c<1>);
  65. BOOST_HANA_RUNTIME_CHECK(hana::at_key(xs, hana::int_c<1>) == '1');
  66. c = '9';
  67. BOOST_HANA_RUNTIME_CHECK(hana::at_key(xs, hana::int_c<1>) == '9');
  68. }
  69. }