123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- // Copyright (C) 2007-8 Anthony Williams
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #define BOOST_THREAD_VERSION 2
- #define BOOST_TEST_MODULE Boost.Threads: move function test suite
- #include <boost/thread/thread_only.hpp>
- #include <boost/test/unit_test.hpp>
- #include <boost/thread/mutex.hpp>
- #include <boost/shared_ptr.hpp>
- void do_nothing()
- {}
- BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_construction)
- {
- boost::thread src(&do_nothing);
- boost::thread::id src_id=src.get_id();
- boost::thread dest(boost::move(src));
- boost::thread::id dest_id=dest.get_id();
- BOOST_CHECK(src_id==dest_id);
- BOOST_CHECK(src.get_id()==boost::thread::id());
- dest.join();
- }
- BOOST_AUTO_TEST_CASE(test_thread_move_from_lvalue_on_assignment)
- {
- boost::thread src(&do_nothing);
- boost::thread::id src_id=src.get_id();
- boost::thread dest;
- dest=boost::move(src);
- boost::thread::id dest_id=dest.get_id();
- BOOST_CHECK(src_id==dest_id);
- BOOST_CHECK(src.get_id()==boost::thread::id());
- dest.join();
- }
- boost::thread start_thread()
- {
- return boost::thread(&do_nothing);
- }
- BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_on_construction)
- {
- boost::thread x(start_thread());
- BOOST_CHECK(x.get_id()!=boost::thread::id());
- x.join();
- }
- BOOST_AUTO_TEST_CASE(test_thread_move_from_rvalue_using_explicit_move)
- {
- //boost::thread x(boost::move(start_thread()));
- boost::thread x=start_thread();
- BOOST_CHECK(x.get_id()!=boost::thread::id());
- x.join();
- }
- BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_lvalue_on_construction)
- {
- boost::mutex m;
- boost::unique_lock<boost::mutex> l(m);
- BOOST_CHECK(l.owns_lock());
- BOOST_CHECK(l.mutex()==&m);
- boost::unique_lock<boost::mutex> l2(boost::move(l));
- BOOST_CHECK(!l.owns_lock());
- BOOST_CHECK(!l.mutex());
- BOOST_CHECK(l2.owns_lock());
- BOOST_CHECK(l2.mutex()==&m);
- }
- boost::unique_lock<boost::mutex> get_lock(boost::mutex& m)
- {
- return boost::unique_lock<boost::mutex>(m);
- }
- BOOST_AUTO_TEST_CASE(test_unique_lock_move_from_rvalue_on_construction)
- {
- boost::mutex m;
- boost::unique_lock<boost::mutex> l(get_lock(m));
- BOOST_CHECK(l.owns_lock());
- BOOST_CHECK(l.mutex()==&m);
- }
- namespace user_test_ns
- {
- template<typename T>
- T move(T& t)
- {
- return t.move();
- }
- bool move_called=false;
- struct nc:
- public boost::shared_ptr<int>
- {
- #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
- nc() {}
- nc(nc&&)
- {
- move_called=true;
- }
- #endif
- nc move()
- {
- move_called=true;
- return nc();
- }
- };
- }
- namespace boost
- {
- BOOST_THREAD_DCL_MOVABLE(user_test_ns::nc)
- }
- BOOST_AUTO_TEST_CASE(test_move_for_user_defined_type_unaffected)
- {
- user_test_ns::nc src;
- #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
- user_test_ns::nc dest=boost::move(src);
- #else
- user_test_ns::nc dest=move(src);
- #endif
- BOOST_CHECK(user_test_ns::move_called);
- }
|