assign.move.cpp 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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/map.hpp>
  7. #include <boost/hana/pair.hpp>
  8. #include <laws/base.hpp>
  9. #include <string>
  10. #include <utility>
  11. namespace hana = boost::hana;
  12. namespace test = hana::test;
  13. struct MoveOnly {
  14. int data_;
  15. MoveOnly(MoveOnly const&) = delete;
  16. MoveOnly& operator=(MoveOnly const&) = delete;
  17. MoveOnly(int data = 1) : data_(data) { }
  18. MoveOnly(MoveOnly&& x) : data_(x.data_) { x.data_ = 0; }
  19. MoveOnly& operator=(MoveOnly&& x)
  20. { data_ = x.data_; x.data_ = 0; return *this; }
  21. int get() const {return data_;}
  22. bool operator==(const MoveOnly& x) const { return data_ == x.data_; }
  23. bool operator< (const MoveOnly& x) const { return data_ < x.data_; }
  24. };
  25. int main() {
  26. {
  27. using Map = hana::map<>;
  28. Map map0;
  29. Map map;
  30. map0 = std::move(map);
  31. }
  32. {
  33. using Map = hana::map<hana::pair<test::ct_eq<0>, MoveOnly>>;
  34. Map map0 = hana::make_map(hana::make_pair(test::ct_eq<0>{}, MoveOnly{999}));
  35. Map map = hana::make_map(hana::make_pair(test::ct_eq<0>{}, MoveOnly{4}));
  36. map0 = std::move(map);
  37. BOOST_HANA_RUNTIME_CHECK(hana::at_key(map0, test::ct_eq<0>{}) == MoveOnly{4});
  38. }
  39. {
  40. using Map = hana::map<hana::pair<test::ct_eq<0>, MoveOnly>,
  41. hana::pair<test::ct_eq<1>, MoveOnly>>;
  42. Map map0 = hana::make_map(hana::make_pair(test::ct_eq<0>{}, MoveOnly{999}),
  43. hana::make_pair(test::ct_eq<1>{}, MoveOnly{888}));
  44. Map map = hana::make_map(hana::make_pair(test::ct_eq<0>{}, MoveOnly{4}),
  45. hana::make_pair(test::ct_eq<1>{}, MoveOnly{5}));
  46. map0 = std::move(map);
  47. BOOST_HANA_RUNTIME_CHECK(hana::at_key(map0, test::ct_eq<0>{}) == MoveOnly{4});
  48. BOOST_HANA_RUNTIME_CHECK(hana::at_key(map0, test::ct_eq<1>{}) == MoveOnly{5});
  49. }
  50. {
  51. using Map = hana::map<hana::pair<test::ct_eq<0>, MoveOnly>,
  52. hana::pair<test::ct_eq<1>, MoveOnly>,
  53. hana::pair<test::ct_eq<2>, MoveOnly>>;
  54. Map map0 = hana::make_map(hana::make_pair(test::ct_eq<0>{}, MoveOnly{999}),
  55. hana::make_pair(test::ct_eq<1>{}, MoveOnly{888}),
  56. hana::make_pair(test::ct_eq<2>{}, MoveOnly{777}));
  57. Map map = hana::make_map(hana::make_pair(test::ct_eq<0>{}, MoveOnly{4}),
  58. hana::make_pair(test::ct_eq<1>{}, MoveOnly{5}),
  59. hana::make_pair(test::ct_eq<2>{}, MoveOnly{6}));
  60. map0 = std::move(map);
  61. BOOST_HANA_RUNTIME_CHECK(hana::at_key(map0, test::ct_eq<0>{}) == MoveOnly{4});
  62. BOOST_HANA_RUNTIME_CHECK(hana::at_key(map0, test::ct_eq<1>{}) == MoveOnly{5});
  63. BOOST_HANA_RUNTIME_CHECK(hana::at_key(map0, test::ct_eq<2>{}) == MoveOnly{6});
  64. }
  65. {
  66. using Map = hana::map<hana::pair<test::ct_eq<0>, MoveOnly>,
  67. hana::pair<test::ct_eq<1>, MoveOnly>,
  68. hana::pair<test::ct_eq<2>, MoveOnly>,
  69. hana::pair<test::ct_eq<3>, std::string>>;
  70. Map map0 = hana::make_map(hana::make_pair(test::ct_eq<0>{}, MoveOnly{999}),
  71. hana::make_pair(test::ct_eq<1>{}, MoveOnly{888}),
  72. hana::make_pair(test::ct_eq<2>{}, MoveOnly{777}),
  73. hana::make_pair(test::ct_eq<3>{}, std::string{"zzzzz"}));
  74. Map map = hana::make_map(hana::make_pair(test::ct_eq<0>{}, MoveOnly{4}),
  75. hana::make_pair(test::ct_eq<1>{}, MoveOnly{5}),
  76. hana::make_pair(test::ct_eq<2>{}, MoveOnly{6}),
  77. hana::make_pair(test::ct_eq<3>{}, std::string{"abc"}));
  78. map0 = std::move(map);
  79. BOOST_HANA_RUNTIME_CHECK(hana::at_key(map0, test::ct_eq<0>{}) == MoveOnly{4});
  80. BOOST_HANA_RUNTIME_CHECK(hana::at_key(map0, test::ct_eq<1>{}) == MoveOnly{5});
  81. BOOST_HANA_RUNTIME_CHECK(hana::at_key(map0, test::ct_eq<2>{}) == MoveOnly{6});
  82. BOOST_HANA_RUNTIME_CHECK(hana::at_key(map0, test::ct_eq<3>{}) == std::string{"abc"});
  83. }
  84. }