test_move_function.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // Copyright (C) 2007-8 Anthony Williams
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #define BOOST_THREAD_VERSION 2
  6. #define BOOST_TEST_MODULE Boost.Threads: move function test suite
  7. #include <boost/thread/thread_only.hpp>
  8. #include <boost/test/unit_test.hpp>
  9. #include <boost/thread/mutex.hpp>
  10. #include <boost/shared_ptr.hpp>
  11. void do_nothing()
  12. {}
  13. BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_construction)
  14. {
  15. boost::thread src(&do_nothing);
  16. boost::thread::id src_id=src.get_id();
  17. boost::thread dest(boost::move(src));
  18. boost::thread::id dest_id=dest.get_id();
  19. BOOST_CHECK(src_id==dest_id);
  20. BOOST_CHECK(src.get_id()==boost::thread::id());
  21. dest.join();
  22. }
  23. BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_assignment)
  24. {
  25. boost::thread src(&do_nothing);
  26. boost::thread::id src_id=src.get_id();
  27. boost::thread dest;
  28. dest=boost::move(src);
  29. boost::thread::id dest_id=dest.get_id();
  30. BOOST_CHECK(src_id==dest_id);
  31. BOOST_CHECK(src.get_id()==boost::thread::id());
  32. dest.join();
  33. }
  34. boost::thread start_thread()
  35. {
  36. return boost::thread(&do_nothing);
  37. }
  38. BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_on_construction)
  39. {
  40. boost::thread x(start_thread());
  41. BOOST_CHECK(x.get_id()!=boost::thread::id());
  42. x.join();
  43. }
  44. BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_using_explicit_move)
  45. {
  46. //boost::thread x(boost::move(start_thread()));
  47. boost::thread x=start_thread();
  48. BOOST_CHECK(x.get_id()!=boost::thread::id());
  49. x.join();
  50. }
  51. BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_lvalue_on_construction)
  52. {
  53. boost::mutex m;
  54. boost::unique_lock<boost::mutex> l(m);
  55. BOOST_CHECK(l.owns_lock());
  56. BOOST_CHECK(l.mutex()==&m);
  57. boost::unique_lock<boost::mutex> l2(boost::move(l));
  58. BOOST_CHECK(!l.owns_lock());
  59. BOOST_CHECK(!l.mutex());
  60. BOOST_CHECK(l2.owns_lock());
  61. BOOST_CHECK(l2.mutex()==&m);
  62. }
  63. boost::unique_lock<boost::mutex> get_lock(boost::mutex& m)
  64. {
  65. return boost::unique_lock<boost::mutex>(m);
  66. }
  67. BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_rvalue_on_construction)
  68. {
  69. boost::mutex m;
  70. boost::unique_lock<boost::mutex> l(get_lock(m));
  71. BOOST_CHECK(l.owns_lock());
  72. BOOST_CHECK(l.mutex()==&m);
  73. }
  74. namespace user_test_ns
  75. {
  76. template<typename T>
  77. T move(T& t)
  78. {
  79. return t.move();
  80. }
  81. bool move_called=false;
  82. struct nc:
  83. public boost::shared_ptr<int>
  84. {
  85. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  86. nc() {}
  87. nc(nc&&)
  88. {
  89. move_called=true;
  90. }
  91. #endif
  92. nc move()
  93. {
  94. move_called=true;
  95. return nc();
  96. }
  97. };
  98. }
  99. namespace boost
  100. {
  101. BOOST_THREAD_DCL_MOVABLE(user_test_ns::nc)
  102. }
  103. BOOST_AUTO_TEST_CASE(test_move_for_user_defined_type_unaffected)
  104. {
  105. user_test_ns::nc src;
  106. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  107. user_test_ns::nc dest=boost::move(src);
  108. #else
  109. user_test_ns::nc dest=move(src);
  110. #endif
  111. BOOST_CHECK(user_test_ns::move_called);
  112. }