test_move_function.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 125 行
CPP
125 行
// 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)#include <boost/thread/thread.hpp>#include <boost/test/unit_test.hpp>#include <boost/thread/mutex.hpp>#include <boost/shared_ptr.hpp>void do_nothing(){}void 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();}void 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);}void test_thread_move_from_rvalue_on_construction(){ boost::thread x(start_thread()); BOOST_CHECK(x.get_id()!=boost::thread::id()); x.join();}void test_thread_move_from_rvalue_using_explicit_move(){ boost::thread x(boost::move(start_thread())); BOOST_CHECK(x.get_id()!=boost::thread::id()); x.join();}void 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);}void 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> { nc move() { move_called=true; return nc(); } };}void test_move_for_user_defined_type_unaffected(){ user_test_ns::nc src; user_test_ns::nc dest=move(src); BOOST_CHECK(user_test_ns::move_called);}boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[]){ boost::unit_test_framework::test_suite* test = BOOST_TEST_SUITE("Boost.Threads: thread move test suite"); test->add(BOOST_TEST_CASE(test_thread_move_from_lvalue_on_construction)); test->add(BOOST_TEST_CASE(test_thread_move_from_rvalue_on_construction)); test->add(BOOST_TEST_CASE(test_thread_move_from_rvalue_using_explicit_move)); test->add(BOOST_TEST_CASE(test_thread_move_from_lvalue_on_assignment)); test->add(BOOST_TEST_CASE(test_unique_lock_move_from_lvalue_on_construction)); test->add(BOOST_TEST_CASE(test_unique_lock_move_from_rvalue_on_construction)); test->add(BOOST_TEST_CASE(test_move_for_user_defined_type_unaffected)); return test;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?