shared_ptr_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 2,927 行 · 第 1/5 页
CPP
2,927 行
BOOST_TEST(pi4.use_count() == pi2.use_count()); BOOST_TEST(!(pi2 < pi4 || pi4 < pi2)); // shared ownership test BOOST_TEST(pi3.use_count() == pi4.use_count()); BOOST_TEST(!(pi3 < pi4 || pi4 < pi3)); // shared ownership test } { boost::shared_ptr<X> px(static_cast<X*>(0)); boost::shared_ptr<X> px2(px); BOOST_TEST(px2 == px); BOOST_TEST(px2? false: true); BOOST_TEST(!px2); BOOST_TEST(px2.get() == 0); BOOST_TEST(px2.use_count() == 2); BOOST_TEST(!px2.unique()); BOOST_TEST(px2.use_count() == px.use_count()); BOOST_TEST(!(px < px2 || px2 < px)); // shared ownership test boost::shared_ptr<void> px3(px); BOOST_TEST(px3 == px); BOOST_TEST(px3? false: true); BOOST_TEST(!px3); BOOST_TEST(px3.get() == 0); BOOST_TEST(px3.use_count() == 3); BOOST_TEST(!px3.unique()); BOOST_TEST(px3.use_count() == px.use_count()); BOOST_TEST(!(px < px3 || px3 < px)); // shared ownership test boost::shared_ptr<void> px4(px2); BOOST_TEST(px4 == px2); BOOST_TEST(px4? false: true); BOOST_TEST(!px4); BOOST_TEST(px4.get() == 0); BOOST_TEST(px4.use_count() == 4); BOOST_TEST(!px4.unique()); BOOST_TEST(px4.use_count() == px2.use_count()); BOOST_TEST(!(px2 < px4 || px4 < px2)); // shared ownership test BOOST_TEST(px3.use_count() == px4.use_count()); BOOST_TEST(!(px3 < px4 || px4 < px3)); // shared ownership test } { int * p = new int(7); boost::shared_ptr<int> pi(p); boost::shared_ptr<int> pi2(pi); BOOST_TEST(pi2 == pi); BOOST_TEST(pi2? true: false); BOOST_TEST(!!pi2); BOOST_TEST(pi2.get() == p); BOOST_TEST(pi2.use_count() == 2); BOOST_TEST(!pi2.unique()); BOOST_TEST(*pi2 == 7); BOOST_TEST(pi2.use_count() == pi.use_count()); BOOST_TEST(!(pi < pi2 || pi2 < pi)); // shared ownership test } { int * p = new int(7); boost::shared_ptr<void> pv(p); BOOST_TEST(pv.get() == p); boost::shared_ptr<void> pv2(pv); BOOST_TEST(pv2 == pv); BOOST_TEST(pv2? true: false); BOOST_TEST(!!pv2); BOOST_TEST(pv2.get() == p); BOOST_TEST(pv2.use_count() == 2); BOOST_TEST(!pv2.unique()); BOOST_TEST(pv2.use_count() == pv.use_count()); BOOST_TEST(!(pv < pv2 || pv2 < pv)); // shared ownership test } BOOST_TEST(X::instances == 0); { X * p = new X; boost::shared_ptr<X> px(p); BOOST_TEST(px.get() == p); boost::shared_ptr<X> px2(px); BOOST_TEST(px2 == px); BOOST_TEST(px2? true: false); BOOST_TEST(!!px2); BOOST_TEST(px2.get() == p); BOOST_TEST(px2.use_count() == 2); BOOST_TEST(!px2.unique()); BOOST_TEST(X::instances == 1); BOOST_TEST(px2.use_count() == px.use_count()); BOOST_TEST(!(px < px2 || px2 < px)); // shared ownership test boost::shared_ptr<void> px3(px); BOOST_TEST(px3 == px); BOOST_TEST(px3? true: false); BOOST_TEST(!!px3); BOOST_TEST(px3.get() == p); BOOST_TEST(px3.use_count() == 3); BOOST_TEST(!px3.unique()); BOOST_TEST(px3.use_count() == px.use_count()); BOOST_TEST(!(px < px3 || px3 < px)); // shared ownership test boost::shared_ptr<void> px4(px2); BOOST_TEST(px4 == px2); BOOST_TEST(px4? true: false); BOOST_TEST(!!px4); BOOST_TEST(px4.get() == p); BOOST_TEST(px4.use_count() == 4); BOOST_TEST(!px4.unique()); BOOST_TEST(px4.use_count() == px2.use_count()); BOOST_TEST(!(px2 < px4 || px4 < px2)); // shared ownership test BOOST_TEST(px3.use_count() == px4.use_count()); BOOST_TEST(!(px3 < px4 || px4 < px3)); // shared ownership test } BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0); { Y * p = new Y; boost::shared_ptr<Y> py(p); BOOST_TEST(py.get() == p); boost::shared_ptr<X> px(py); BOOST_TEST(px == py); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == p); BOOST_TEST(px.use_count() == 2); BOOST_TEST(!px.unique()); BOOST_TEST(px.use_count() == py.use_count()); BOOST_TEST(!(px < py || py < px)); // shared ownership test BOOST_TEST(X::instances == 1); BOOST_TEST(Y::instances == 1); boost::shared_ptr<void const> pv(px); BOOST_TEST(pv == px); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == px.get()); BOOST_TEST(pv.use_count() == 3); BOOST_TEST(!pv.unique()); BOOST_TEST(pv.use_count() == px.use_count()); BOOST_TEST(!(px < pv || pv < px)); // shared ownership test boost::shared_ptr<void const> pv2(py); BOOST_TEST(pv2 == py); BOOST_TEST(pv2? true: false); BOOST_TEST(!!pv2); BOOST_TEST(pv2.get() == py.get()); BOOST_TEST(pv2.use_count() == 4); BOOST_TEST(!pv2.unique()); BOOST_TEST(pv2.use_count() == py.use_count()); BOOST_TEST(!(py < pv2 || pv2 < py)); // shared ownership test BOOST_TEST(pv.use_count() == pv2.use_count()); BOOST_TEST(!(pv < pv2 || pv2 < pv)); // shared ownership test } BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0);}void weak_ptr_constructor(){ { boost::weak_ptr<Y> wp; BOOST_TEST(wp.use_count() == 0); try { boost::shared_ptr<Y> p2(wp); BOOST_ERROR("shared_ptr<Y> p2(wp) failed to throw"); } catch(boost::bad_weak_ptr) { } try { boost::shared_ptr<X> p3(wp); BOOST_ERROR("shared_ptr<X> p3(wp) failed to throw"); } catch(boost::bad_weak_ptr) { } } { boost::shared_ptr<Y> p; boost::weak_ptr<Y> wp(p); if(wp.use_count() != 0) // 0 allowed but not required { boost::shared_ptr<Y> p2(wp); BOOST_TEST(p2.use_count() == wp.use_count()); BOOST_TEST(p2.get() == 0); boost::shared_ptr<X> p3(wp); BOOST_TEST(p3.use_count() == wp.use_count()); BOOST_TEST(p3.get() == 0); } } { boost::shared_ptr<Y> p(new Y); boost::weak_ptr<Y> wp(p); { boost::shared_ptr<Y> p2(wp); BOOST_TEST(p2? true: false); BOOST_TEST(!!p2); BOOST_TEST(p2.get() == p.get()); BOOST_TEST(p2.use_count() == 2); BOOST_TEST(!p2.unique()); BOOST_TEST(p2.use_count() == wp.use_count()); BOOST_TEST(p.use_count() == p2.use_count()); BOOST_TEST(!(p < p2 || p2 < p)); // shared ownership test boost::shared_ptr<X> p3(wp); BOOST_TEST(p3? true: false); BOOST_TEST(!!p3); BOOST_TEST(p3.get() == p.get()); BOOST_TEST(p3.use_count() == 3); BOOST_TEST(!p3.unique()); BOOST_TEST(p3.use_count() == wp.use_count()); BOOST_TEST(p.use_count() == p3.use_count()); } p.reset(); BOOST_TEST(wp.use_count() == 0); try { boost::shared_ptr<Y> p2(wp); BOOST_ERROR("shared_ptr<Y> p2(wp) failed to throw"); } catch(boost::bad_weak_ptr) { } try { boost::shared_ptr<X> p3(wp); BOOST_ERROR("shared_ptr<X> p3(wp) failed to throw"); } catch(boost::bad_weak_ptr) { } }}#if defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB < 306)# define BOOST_OLD_AUTO_PTR#endifvoid auto_ptr_constructor(){ { std::auto_ptr<int> p; boost::shared_ptr<int> pi(p); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); BOOST_TEST(p.get() == 0); } { std::auto_ptr<int> p; boost::shared_ptr<int const> pi(p); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); BOOST_TEST(p.get() == 0); } { std::auto_ptr<int> p; boost::shared_ptr<void> pv(p); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); BOOST_TEST(p.get() == 0); } { std::auto_ptr<int> p; boost::shared_ptr<void const> pv(p); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); BOOST_TEST(p.get() == 0); } { std::auto_ptr<X> p; boost::shared_ptr<X> px(p); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(p.get() == 0); } { std::auto_ptr<X> p; boost::shared_ptr<X const> px(p); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(p.get() == 0); } { std::auto_ptr<Y> p; boost::shared_ptr<X> px(p); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(p.get() == 0); } { std::auto_ptr<Y> p; boost::shared_ptr<X const> px(p); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(p.get() == 0); } { std::auto_ptr<Y> p; boost::shared_ptr<void> pv(p); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); BOOST_TEST(p.get() == 0); } { std::auto_ptr<Y> p; boost::shared_ptr<void const> pv(p); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); BOOST_TEST(p.get() == 0); } { std::auto_ptr<int> p(new int(7)); int * q = p.get(); boost::shared_ptr<int> pi(p); BOOST_TEST(pi? true: false); BOOST_TEST(!!pi); BOOST_TEST(pi.get() == q); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); BOOST_TEST(*pi == 7);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p.get() == 0);#endif } { std::auto_ptr<int> p(new int(7)); int * q = p.get(); boost::shared_ptr<int const> pi(p); BOOST_TEST(pi? true: false); BOOST_TEST(!!pi); BOOST_TEST(pi.get() == q); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); BOOST_TEST(*pi == 7);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p.get() == 0);#endif } { std::auto_ptr<int> p(new int(7)); int * q = p.get(); boost::shared_ptr<void> pv(p); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == q); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique());#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p.get() == 0);#endif } { std::auto_ptr<int> p(new int(7)); int * q = p.get(); boost::shared_ptr<void const> pv(p); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == q); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique());#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p.get() == 0);#endif } BOOST_TEST(X::instances == 0); { std::auto_ptr<X> p(new X); X * q = p.get(); boost::shared_ptr<X> px(p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == q); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(X::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p.get() == 0);#endif } BOOST_TEST(X::instances == 0); { std::auto_ptr<X> p(new X); X * q = p.get(); boost::shared_ptr<X const> px(p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == q); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(X::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p.get() == 0);#endif } BOOST_TEST(X::instances == 0); { std::auto_ptr<X> p(new X); X * q = p.get(); boost::shared_ptr<void> pv(p); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == q); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); BOOST_TEST(X::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p.get() == 0);#endif } BOOST_TEST(X::instances == 0); { std::auto_ptr<X> p(new X); X * q = p.get(); boost::shared_ptr<void const> pv(p); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == q); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); BOOST_TEST(X::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p.get() == 0);#endif } BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0); { std::auto_ptr<Y> p(new Y); Y * q = p.get(); boost::shared_ptr<X> px(p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == q); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(X::instances == 1); BOOST_TEST(Y::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p.get() == 0);#endif } BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0); { std::auto_ptr<Y> p(new Y); Y * q = p.get(); boost::shared_ptr<X const> px(p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == q); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(X::instances == 1); BOOST_TEST(Y::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p.get() == 0);#endif } BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0);}void test(){ default_constructor(); pointer_constructor(); deleter_constructor(); copy_constructor(); weak_ptr_constructor(); auto_ptr_constructor();}} // namespace n_constructorsnamespace n_assignment{class incomplete;struct A{ int dummy;};struct X{ static long instances; X() { ++instances; } ~X()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?