cnstr.convert_move.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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/tuple.hpp>
  6. #include <string>
  7. #include <memory>
  8. namespace hana = boost::hana;
  9. struct B {
  10. int id_;
  11. explicit B(int i) : id_(i) {}
  12. virtual ~B() {}
  13. };
  14. struct D : B {
  15. explicit D(int i) : B(i) {}
  16. };
  17. int main() {
  18. {
  19. using T0 = hana::tuple<double>;
  20. using T1 = hana::tuple<int>;
  21. T0 t0(2.5);
  22. T1 t1 = std::move(t0);
  23. BOOST_HANA_RUNTIME_CHECK(hana::at_c<0>(t1) == 2);
  24. }
  25. {
  26. using T0 = hana::tuple<double, char>;
  27. using T1 = hana::tuple<int, int>;
  28. T0 t0(2.5, 'a');
  29. T1 t1 = std::move(t0);
  30. BOOST_HANA_RUNTIME_CHECK(hana::at_c<0>(t1) == 2);
  31. BOOST_HANA_RUNTIME_CHECK(hana::at_c<1>(t1) == int('a'));
  32. }
  33. {
  34. using T0 = hana::tuple<double, char, D>;
  35. using T1 = hana::tuple<int, int, B>;
  36. T0 t0(2.5, 'a', D(3));
  37. T1 t1 = std::move(t0);
  38. BOOST_HANA_RUNTIME_CHECK(hana::at_c<0>(t1) == 2);
  39. BOOST_HANA_RUNTIME_CHECK(hana::at_c<1>(t1) == int('a'));
  40. BOOST_HANA_RUNTIME_CHECK(hana::at_c<2>(t1).id_ == 3);
  41. }
  42. {
  43. D d(3);
  44. using T0 = hana::tuple<double, char, D&>;
  45. using T1 = hana::tuple<int, int, B&>;
  46. T0 t0(2.5, 'a', d);
  47. T1 t1 = std::move(t0);
  48. d.id_ = 2;
  49. BOOST_HANA_RUNTIME_CHECK(hana::at_c<0>(t1) == 2);
  50. BOOST_HANA_RUNTIME_CHECK(hana::at_c<1>(t1) == int('a'));
  51. BOOST_HANA_RUNTIME_CHECK(hana::at_c<2>(t1).id_ == 2);
  52. }
  53. {
  54. using T0 = hana::tuple<double, char, std::unique_ptr<D>>;
  55. using T1 = hana::tuple<int, int, std::unique_ptr<B>>;
  56. T0 t0(2.5, 'a', std::unique_ptr<D>(new D(3)));
  57. T1 t1 = std::move(t0);
  58. BOOST_HANA_RUNTIME_CHECK(hana::at_c<0>(t1) == 2);
  59. BOOST_HANA_RUNTIME_CHECK(hana::at_c<1>(t1) == int('a'));
  60. BOOST_HANA_RUNTIME_CHECK(hana::at_c<2>(t1)->id_ == 3);
  61. }
  62. }