shared_ptr_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 2,927 行 · 第 1/5 页
CPP
2,927 行
pv.reset(static_cast<X*>(0)); 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(X::instances == 0); X * p = new X; pv.reset(p); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == p); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); BOOST_TEST(X::instances == 1); pv.reset(static_cast<X*>(0)); 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(X::instances == 0); BOOST_TEST(Y::instances == 0); Y * q = new Y; pv.reset(q); 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); BOOST_TEST(Y::instances == 1); pv.reset(static_cast<Y*>(0)); 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(X::instances == 0); BOOST_TEST(Y::instances == 0); }}void * deleted = 0;void deleter2(void * p){ deleted = p;}void deleter_reset(){ { boost::shared_ptr<int> pi; pi.reset(static_cast<int*>(0), deleter2); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); deleted = π int m = 0; pi.reset(&m, deleter2); BOOST_TEST(deleted == 0); BOOST_TEST(pi? true: false); BOOST_TEST(!!pi); BOOST_TEST(pi.get() == &m); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); pi.reset(static_cast<int*>(0), deleter2); BOOST_TEST(deleted == &m); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); pi.reset(); BOOST_TEST(deleted == 0); } { boost::shared_ptr<X> px; px.reset(static_cast<X*>(0), deleter2); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); deleted = &px; X x; px.reset(&x, deleter2); BOOST_TEST(deleted == 0); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == &x); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); px.reset(static_cast<X*>(0), deleter2); BOOST_TEST(deleted == &x); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); Y y; px.reset(&y, deleter2); BOOST_TEST(deleted == 0); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == &y); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); px.reset(static_cast<Y*>(0), deleter2); BOOST_TEST(deleted == &y); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); px.reset(); BOOST_TEST(deleted == 0); } { boost::shared_ptr<void> pv; pv.reset(static_cast<X*>(0), deleter2); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); deleted = &pv; X x; pv.reset(&x, deleter2); BOOST_TEST(deleted == 0); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == &x); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); pv.reset(static_cast<X*>(0), deleter2); BOOST_TEST(deleted == &x); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); Y y; pv.reset(&y, deleter2); BOOST_TEST(deleted == 0); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == &y); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); pv.reset(static_cast<Y*>(0), deleter2); BOOST_TEST(deleted == &y); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); pv.reset(); BOOST_TEST(deleted == 0); } { boost::shared_ptr<incomplete> px; px.reset(p0, deleter2); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); deleted = &px; px.reset(p0, deleter2); BOOST_TEST(deleted == 0); }}void test(){ plain_reset(); pointer_reset(); deleter_reset();}} // namespace n_resetnamespace n_access{struct X{};void test(){ { boost::shared_ptr<X> px; BOOST_TEST(px.get() == 0); BOOST_TEST(px? false: true); BOOST_TEST(!px);#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) using boost::get_pointer;#endif BOOST_TEST(get_pointer(px) == px.get()); } { boost::shared_ptr<X> px(static_cast<X*>(0)); BOOST_TEST(px.get() == 0); BOOST_TEST(px? false: true); BOOST_TEST(!px);#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) using boost::get_pointer;#endif BOOST_TEST(get_pointer(px) == px.get()); } { boost::shared_ptr<X> px(static_cast<X*>(0), boost::checked_deleter<X>()); BOOST_TEST(px.get() == 0); BOOST_TEST(px? false: true); BOOST_TEST(!px);#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) using boost::get_pointer;#endif BOOST_TEST(get_pointer(px) == px.get()); } { X * p = new X; boost::shared_ptr<X> px(p); BOOST_TEST(px.get() == p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(&*px == px.get()); BOOST_TEST(px.operator ->() == px.get());#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) using boost::get_pointer;#endif BOOST_TEST(get_pointer(px) == px.get()); } { X * p = new X; boost::shared_ptr<X> px(p, boost::checked_deleter<X>()); BOOST_TEST(px.get() == p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(&*px == px.get()); BOOST_TEST(px.operator ->() == px.get());#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) using boost::get_pointer;#endif BOOST_TEST(get_pointer(px) == px.get()); }}} // namespace n_accessnamespace n_use_count{struct X{};void test(){ { boost::shared_ptr<X> px(static_cast<X*>(0)); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); boost::shared_ptr<X> px2(px); BOOST_TEST(px2.use_count() == 2); BOOST_TEST(!px2.unique()); BOOST_TEST(px.use_count() == 2); BOOST_TEST(!px.unique()); } { boost::shared_ptr<X> px(new X); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); boost::shared_ptr<X> px2(px); BOOST_TEST(px2.use_count() == 2); BOOST_TEST(!px2.unique()); BOOST_TEST(px.use_count() == 2); BOOST_TEST(!px.unique()); } { boost::shared_ptr<X> px(new X, boost::checked_deleter<X>()); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); boost::shared_ptr<X> px2(px); BOOST_TEST(px2.use_count() == 2); BOOST_TEST(!px2.unique()); BOOST_TEST(px.use_count() == 2); BOOST_TEST(!px.unique()); }}} // namespace n_use_countnamespace n_swap{struct X{};void test(){ { boost::shared_ptr<X> px; boost::shared_ptr<X> px2; px.swap(px2); BOOST_TEST(px.get() == 0); BOOST_TEST(px2.get() == 0); using std::swap; swap(px, px2); BOOST_TEST(px.get() == 0); BOOST_TEST(px2.get() == 0); } { X * p = new X; boost::shared_ptr<X> px; boost::shared_ptr<X> px2(p); boost::shared_ptr<X> px3(px2); px.swap(px2); BOOST_TEST(px.get() == p); BOOST_TEST(px.use_count() == 2); BOOST_TEST(px2.get() == 0); BOOST_TEST(px3.get() == p); BOOST_TEST(px3.use_count() == 2); using std::swap; swap(px, px2); BOOST_TEST(px.get() == 0); BOOST_TEST(px2.get() == p); BOOST_TEST(px2.use_count() == 2); BOOST_TEST(px3.get() == p); BOOST_TEST(px3.use_count() == 2); } { X * p1 = new X; X * p2 = new X; boost::shared_ptr<X> px(p1); boost::shared_ptr<X> px2(p2); boost::shared_ptr<X> px3(px2); px.swap(px2); BOOST_TEST(px.get() == p2); BOOST_TEST(px.use_count() == 2); BOOST_TEST(px2.get() == p1); BOOST_TEST(px2.use_count() == 1); BOOST_TEST(px3.get() == p2); BOOST_TEST(px3.use_count() == 2); using std::swap; swap(px, px2); BOOST_TEST(px.get() == p1); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px2.get() == p2); BOOST_TEST(px2.use_count() == 2); BOOST_TEST(px3.get() == p2); BOOST_TEST(px3.use_count() == 2); }}} // namespace n_swapnamespace n_comparison{struct X{ int dummy;};struct Y{ int dummy2;};struct Z: public X, public virtual Y{};void test(){ { boost::shared_ptr<X> px; BOOST_TEST(px == px); BOOST_TEST(!(px != px)); BOOST_TEST(!(px < px)); boost::shared_ptr<X> px2; BOOST_TEST(px.get() == px2.get()); BOOST_TEST(px == px2); BOOST_TEST(!(px != px2)); BOOST_TEST(!(px < px2 && px2 < px)); } { boost::shared_ptr<X> px; boost::shared_ptr<X> px2(px); BOOST_TEST(px2 == px2); BOOST_TEST(!(px2 != px2)); BOOST_TEST(!(px2 < px2)); BOOST_TEST(px.get() == px2.get()); BOOST_TEST(px == px2); BOOST_TEST(!(px != px2)); BOOST_TEST(!(px < px2 && px2 < px)); } { boost::shared_ptr<X> px; boost::shared_ptr<X> px2(new X); BOOST_TEST(px2 == px2); BOOST_TEST(!(px2 != px2)); BOOST_TEST(!(px2 < px2)); BOOST_TEST(px.get() != px2.get()); BOOST_TEST(px != px2); BOOST_TEST(!(px == px2)); BOOST_TEST(px < px2 || px2 < px); BOOST_TEST(!(px < px2 && px2 < px)); } { boost::shared_ptr<X> px(new X); boost::shared_ptr<X> px2(new X); BOOST_TEST(px.get() != px2.get()); BOOST_TEST(px != px2); BOOST_TEST(!(px == px2)); BOOST_TEST(px < px2 || px2 < px); BOOST_TEST(!(px < px2 && px2 < px)); } { boost::shared_ptr<X> px(new X); boost::shared_ptr<X> px2(px); BOOST_TEST(px2 == px2); BOOST_TEST(!(px2 != px2)); BOOST_TEST(!(px2 < px2)); BOOST_TEST(px.get() == px2.get()); BOOST_TEST(px == px2); BOOST_TEST(!(px != px2)); BOOST_TEST(!(px < px2 || px2 < px)); } { boost::shared_ptr<X> px(new X); boost::shared_ptr<Y> py(new Y); boost::shared_ptr<Z> pz(new Z); BOOST_TEST(px.get() != pz.get()); BOOST_TEST(px != pz); BOOST_TEST(!(px == pz)); BOOST_TEST(py.get() != pz.get()); BOOST_TEST(py != pz); BOOST_TEST(!(py == pz)); BOOST_TEST(px < py || py < px); BOOST_TEST(px < pz || pz < px); BOOST_TEST(py < pz || pz < py); BOOST_TEST(!(px < py && py < px)); BOOST_TEST(!(px < pz && pz < px)); BOOST_TEST(!(py < pz && pz < py)); boost::shared_ptr<void> pvx(px); BOOST_TEST(pvx == pvx); BOOST_TEST(!(pvx != pvx)); BOOST_TEST(!(pvx < pvx)); boost::shared_ptr<void> pvy(py); boost::shared_ptr<void> pvz(pz); BOOST_TEST(pvx < pvy || pvy < pvx); BOOST_TEST(pvx < pvz || pvz < pvx); BOOST_TEST(pvy < pvz || pvz < pvy); BOOST_TEST(!(pvx < pvy && pvy < pvx)); BOOST_TEST(!(pvx < pvz && pvz < pvx)); BOOST_TEST(!(pvy < pvz && pvz < pvy)); } { boost::shared_ptr<Z> pz(new Z); boost::shared_ptr<X> px(pz); BOOST_TEST(px == px); BOOST_TEST(!(px != px)); BOOST_TEST(!(px < px)); boost::shared_ptr<Y> py(pz); BOOST_TEST(px.get() == pz.get()); BOOST_TEST(px == pz); BOOST_TEST(!(px != pz)); BOOST_TEST(py.get() == pz.get()); BOOST_TEST(py == pz); BOOST_TEST(!(py != pz)); BOOST_TEST(!(px < py || py < px)); BOOST_TEST(!(px < pz || pz < px)); BOOST_TEST(!(py < pz || pz < py)); boost::shared_ptr<void> pvx(px); boost::shared_ptr<void> pvy(py); boost::shared_ptr<void> pvz(pz); // pvx and pvy aren't equal... BOOST_TEST(pvx.get() != pvy.get()); BOOST_TEST(pvx != pvy); BOOST_TEST(!(pvx == pvy)); // ... but they share ownership ... BOOST_TEST(!(pvx < pvy || pvy < pvx)); // ... with pvz
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?