weak_ptr_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 1,369 行 · 第 1/3 页
CPP
1,369 行
BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr<X> wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr<Z> sp(new Z); boost::weak_ptr<Z> wp(sp); boost::weak_ptr<Y> wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr<Y> wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); }}void test(){ default_constructor(); shared_ptr_constructor(); copy_constructor(); conversion_constructor();}} // namespace n_constructorsnamespace n_assignment{template<class T> void copy_assignment(boost::shared_ptr<T> & sp){ BOOST_TEST(sp.unique()); boost::weak_ptr<T> p1; p1 = p1; BOOST_TEST(p1.use_count() == 0); boost::weak_ptr<T> p2; p1 = p2; BOOST_TEST(p1.use_count() == 0); boost::weak_ptr<T> p3(p1); p1 = p3; BOOST_TEST(p1.use_count() == 0); boost::weak_ptr<T> p4(sp); p4 = p4; BOOST_TEST(p4.use_count() == 1); p1 = p4; BOOST_TEST(p1.use_count() == 1); p4 = p2; BOOST_TEST(p4.use_count() == 0); sp.reset(); p1 = p1; BOOST_TEST(p1.use_count() == 0); p4 = p1; BOOST_TEST(p4.use_count() == 0);}void conversion_assignment(){ { boost::weak_ptr<void> p1; boost::weak_ptr<incomplete> p2; p1 = p2; BOOST_TEST(p1.use_count() == 0); boost::shared_ptr<incomplete> sp = create_incomplete(); boost::weak_ptr<incomplete> p3(sp); p1 = p3; BOOST_TEST(p1.use_count() == 1); sp.reset(); p1 = p3; BOOST_TEST(p1.use_count() == 0); p1 = p2; BOOST_TEST(p1.use_count() == 0); } { boost::weak_ptr<X> p1; boost::weak_ptr<Z> p2; p1 = p2; BOOST_TEST(p1.use_count() == 0); boost::shared_ptr<Z> sp(new Z); boost::weak_ptr<Z> p3(sp); p1 = p3; BOOST_TEST(p1.use_count() == 1); sp.reset(); p1 = p3; BOOST_TEST(p1.use_count() == 0); p1 = p2; BOOST_TEST(p1.use_count() == 0); } { boost::weak_ptr<Y> p1; boost::weak_ptr<Z> p2; p1 = p2; BOOST_TEST(p1.use_count() == 0); boost::shared_ptr<Z> sp(new Z); boost::weak_ptr<Z> p3(sp); p1 = p3; BOOST_TEST(p1.use_count() == 1); sp.reset(); p1 = p3; BOOST_TEST(p1.use_count() == 0); p1 = p2; BOOST_TEST(p1.use_count() == 0); }}template<class T, class U> void shared_ptr_assignment(boost::shared_ptr<U> & sp, T * = 0){ BOOST_TEST(sp.unique()); boost::weak_ptr<T> p1; boost::weak_ptr<T> p2(p1); boost::weak_ptr<T> p3(sp); boost::weak_ptr<T> p4(p3); p1 = sp; BOOST_TEST(p1.use_count() == 1); p2 = sp; BOOST_TEST(p2.use_count() == 1); p3 = sp; BOOST_TEST(p3.use_count() == 1); p4 = sp; BOOST_TEST(p4.use_count() == 1); sp.reset(); BOOST_TEST(p1.use_count() == 0); BOOST_TEST(p2.use_count() == 0); BOOST_TEST(p3.use_count() == 0); BOOST_TEST(p4.use_count() == 0); p1 = sp;}void test(){ { boost::shared_ptr<int> p( new int ); copy_assignment( p ); } { boost::shared_ptr<X> p( new X ); copy_assignment( p ); } { boost::shared_ptr<void> p( new int ); copy_assignment( p ); } { boost::shared_ptr<incomplete> p = create_incomplete(); copy_assignment( p ); } conversion_assignment(); { boost::shared_ptr<int> p( new int ); shared_ptr_assignment<int>( p ); } { boost::shared_ptr<int> p( new int ); shared_ptr_assignment<void>( p ); } { boost::shared_ptr<X> p( new X ); shared_ptr_assignment<X>( p ); } { boost::shared_ptr<X> p( new X ); shared_ptr_assignment<void>( p ); } { boost::shared_ptr<void> p( new int ); shared_ptr_assignment<void>( p ); } { boost::shared_ptr<incomplete> p = create_incomplete(); shared_ptr_assignment<incomplete>( p ); } { boost::shared_ptr<incomplete> p = create_incomplete(); shared_ptr_assignment<void>( p ); }}} // namespace n_assignmentnamespace n_reset{template<class T, class U> void test2( boost::shared_ptr<U> & sp, T * = 0 ){ BOOST_TEST(sp.unique()); boost::weak_ptr<T> p1; boost::weak_ptr<T> p2(p1); boost::weak_ptr<T> p3(sp); boost::weak_ptr<T> p4(p3); boost::weak_ptr<T> p5(sp); boost::weak_ptr<T> p6(p5); p1.reset(); BOOST_TEST(p1.use_count() == 0); p2.reset(); BOOST_TEST(p2.use_count() == 0); p3.reset(); BOOST_TEST(p3.use_count() == 0); p4.reset(); BOOST_TEST(p4.use_count() == 0); sp.reset(); p5.reset(); BOOST_TEST(p5.use_count() == 0); p6.reset(); BOOST_TEST(p6.use_count() == 0);}void test(){ { boost::shared_ptr<int> p( new int ); test2<int>( p ); } { boost::shared_ptr<int> p( new int ); test2<void>( p ); } { boost::shared_ptr<X> p( new X ); test2<X>( p ); } { boost::shared_ptr<X> p( new X ); test2<void>( p ); } { boost::shared_ptr<void> p( new int ); test2<void>( p ); } { boost::shared_ptr<incomplete> p = create_incomplete(); test2<incomplete>( p ); } { boost::shared_ptr<incomplete> p = create_incomplete(); test2<void>( p ); }}} // namespace n_resetnamespace n_use_count{void test(){ { boost::weak_ptr<X> wp; BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp.expired()); boost::weak_ptr<X> wp2; BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp.expired()); boost::weak_ptr<X> wp3(wp); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp.expired()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(wp3.expired()); } { boost::shared_ptr<X> sp(static_cast<X*>(0)); boost::weak_ptr<X> wp(sp); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(!wp.expired()); boost::weak_ptr<X> wp2(sp); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(!wp.expired()); boost::weak_ptr<X> wp3(wp); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(!wp.expired()); BOOST_TEST(wp3.use_count() == 1); BOOST_TEST(!wp3.expired()); boost::shared_ptr<X> sp2(sp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!wp.expired()); BOOST_TEST(wp2.use_count() == 2); BOOST_TEST(!wp2.expired()); BOOST_TEST(wp3.use_count() == 2); BOOST_TEST(!wp3.expired()); boost::shared_ptr<void> sp3(sp); BOOST_TEST(wp.use_count() == 3); BOOST_TEST(!wp.expired()); BOOST_TEST(wp2.use_count() == 3); BOOST_TEST(!wp2.expired()); BOOST_TEST(wp3.use_count() == 3); BOOST_TEST(!wp3.expired()); sp.reset(); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!wp.expired()); BOOST_TEST(wp2.use_count() == 2); BOOST_TEST(!wp2.expired()); BOOST_TEST(wp3.use_count() == 2); BOOST_TEST(!wp3.expired()); sp2.reset(); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(!wp.expired()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!wp2.expired()); BOOST_TEST(wp3.use_count() == 1); BOOST_TEST(!wp3.expired()); sp3.reset(); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp.expired()); BOOST_TEST(wp2.use_count() == 0); BOOST_TEST(wp2.expired()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(wp3.expired()); }}} // namespace n_use_countnamespace n_swap{void test(){ { boost::weak_ptr<X> wp; boost::weak_ptr<X> wp2; wp.swap(wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 0); using std::swap; swap(wp, wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 0); } { boost::shared_ptr<X> sp(new X); boost::weak_ptr<X> wp; boost::weak_ptr<X> wp2(sp); boost::weak_ptr<X> wp3(sp); wp.swap(wp2); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(wp2.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); using std::swap; swap(wp, wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp2 < wp3 || wp3 < wp2)); sp.reset(); wp.swap(wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 0);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?