shared_ptr_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 2,927 行 · 第 1/5 页
CPP
2,927 行
#include <boost/config.hpp>#if defined(BOOST_MSVC)#pragma warning(disable: 4786) // identifier truncated in debug info#pragma warning(disable: 4710) // function not inlined#pragma warning(disable: 4711) // function selected for automatic inline expansion#pragma warning(disable: 4514) // unreferenced inline removed#pragma warning(disable: 4355) // 'this' : used in base member initializer list#if (BOOST_MSVC >= 1310)#pragma warning(disable: 4675) // resolved overload found with Koenig lookup#endif#endif//// shared_ptr_test.cpp//// Copyright (c) 2002, 2003 Peter Dimov//// 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/detail/lightweight_test.hpp>#include <boost/shared_ptr.hpp>#include <boost/weak_ptr.hpp>#include <map>#include <vector>//namespace n_element_type{void f(int &){}void test(){ typedef boost::shared_ptr<int>::element_type T; T t; f(t);}} // namespace n_element_typenamespace n_constructors{class incomplete;void default_constructor(){ { boost::shared_ptr<int> pi; BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 0); } { boost::shared_ptr<void> pv; BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 0); } { boost::shared_ptr<incomplete> px; BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 0); }}struct A{ int dummy;};struct X{ static long instances; X() { ++instances; } ~X() { --instances; }private: X(X const &); X & operator= (X const &);};long X::instances = 0;// virtual inheritance stresses the implementationstruct Y: public A, public virtual X{ static long instances; Y() { ++instances; } ~Y() { --instances; }private: Y(Y const &); Y & operator= (Y const &);};long Y::instances = 0;template<class T> void pc0_test(T * p){ BOOST_TEST(p == 0); boost::shared_ptr<T> pt(p); BOOST_TEST(pt? false: true); BOOST_TEST(!pt); BOOST_TEST(pt.get() == 0); BOOST_TEST(pt.use_count() == 1); BOOST_TEST(pt.unique());}void pointer_constructor(){ pc0_test(static_cast<int*>(0));#if !defined(BOOST_MSVC) || (BOOST_MSVC > 1300) pc0_test(static_cast<int const*>(0)); pc0_test(static_cast<int volatile*>(0)); pc0_test(static_cast<int const volatile*>(0));#endif { boost::shared_ptr<int const> pi(static_cast<int*>(0)); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); } { boost::shared_ptr<int volatile> pi(static_cast<int*>(0)); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); } { boost::shared_ptr<void> pv(static_cast<int*>(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::shared_ptr<void const> pv(static_cast<int*>(0)); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); } pc0_test(static_cast<X*>(0)); pc0_test(static_cast<X const*>(0)); pc0_test(static_cast<X volatile*>(0)); pc0_test(static_cast<X const volatile*>(0)); { boost::shared_ptr<X const> px(static_cast<X*>(0)); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); } { boost::shared_ptr<X> px(static_cast<Y*>(0)); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); } { boost::shared_ptr<X const> px(static_cast<Y*>(0)); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); } { boost::shared_ptr<void> pv(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::shared_ptr<void const> pv(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()); } { int * p = new int(7); boost::shared_ptr<int> pi(p); BOOST_TEST(pi? true: false); BOOST_TEST(!!pi); BOOST_TEST(pi.get() == p); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); BOOST_TEST(*pi == 7); } { int * p = new int(7); boost::shared_ptr<int const> pi(p); BOOST_TEST(pi? true: false); BOOST_TEST(!!pi); BOOST_TEST(pi.get() == p); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); BOOST_TEST(*pi == 7); } { int * p = new int(7); boost::shared_ptr<void> pv(p); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == p); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); } { int * p = new int(7); boost::shared_ptr<void const> pv(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 == 0); { X * p = new X; boost::shared_ptr<X> px(p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == p); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(X::instances == 1); } BOOST_TEST(X::instances == 0); { X * p = new X; boost::shared_ptr<X const> px(p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == p); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(X::instances == 1); } BOOST_TEST(X::instances == 0); { X * p = new X; boost::shared_ptr<void> pv(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); } BOOST_TEST(X::instances == 0); { X * p = new X; boost::shared_ptr<void const> pv(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); } BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0); { Y * p = new Y; boost::shared_ptr<X> px(p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == p); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(X::instances == 1); BOOST_TEST(Y::instances == 1); } BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0); { Y * p = new Y; boost::shared_ptr<X const> px(p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == p); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(X::instances == 1); BOOST_TEST(Y::instances == 1); } BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0);}int m = 0;void deleter(int * p){ BOOST_TEST(p == 0);}void deleter2(int * p){ BOOST_TEST(p == &m); ++*p;}struct deleter3{ void operator()(incomplete * p) { BOOST_TEST(p == 0); }};// Borland C++ 5.5.1 fails on static_cast<incomplete*>(0)incomplete * p0 = 0;void deleter_constructor(){ { boost::shared_ptr<int> pi(static_cast<int*>(0), deleter); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); } { boost::shared_ptr<void> pv(static_cast<int*>(0), &deleter); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); } { boost::shared_ptr<void const> pv(static_cast<int*>(0), deleter); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); } { boost::shared_ptr<incomplete> px(p0, deleter3()); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); } { boost::shared_ptr<void> pv(p0, deleter3()); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); } { boost::shared_ptr<void const> pv(p0, deleter3()); 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(m == 0); { boost::shared_ptr<int> pi(&m, deleter2); BOOST_TEST(pi? true: false); BOOST_TEST(!!pi); BOOST_TEST(pi.get() == &m); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); } BOOST_TEST(m == 1); { boost::shared_ptr<int const> pi(&m, &deleter2); BOOST_TEST(pi? true: false); BOOST_TEST(!!pi); BOOST_TEST(pi.get() == &m); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); } BOOST_TEST(m == 2); { boost::shared_ptr<void> pv(&m, deleter2); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == &m); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); } BOOST_TEST(m == 3); { boost::shared_ptr<void const> pv(&m, &deleter2); BOOST_TEST(pv? true: false); BOOST_TEST(!!pv); BOOST_TEST(pv.get() == &m); BOOST_TEST(pv.use_count() == 1); BOOST_TEST(pv.unique()); } BOOST_TEST(m == 4);}void copy_constructor(){ { boost::shared_ptr<int> pi; boost::shared_ptr<int> pi2(pi); BOOST_TEST(pi2 == pi); BOOST_TEST(pi2? false: true); BOOST_TEST(!pi2); BOOST_TEST(pi2.get() == 0); BOOST_TEST(pi2.use_count() == pi.use_count()); boost::shared_ptr<void> pi3(pi); BOOST_TEST(pi3 == pi); BOOST_TEST(pi3? false: true); BOOST_TEST(!pi3); BOOST_TEST(pi3.get() == 0); BOOST_TEST(pi3.use_count() == pi.use_count()); boost::shared_ptr<void> pi4(pi3); BOOST_TEST(pi4 == pi3); BOOST_TEST(pi4? false: true); BOOST_TEST(!pi4); BOOST_TEST(pi4.get() == 0); BOOST_TEST(pi4.use_count() == pi3.use_count()); } { boost::shared_ptr<void> pv; boost::shared_ptr<void> pv2(pv); BOOST_TEST(pv2 == pv); BOOST_TEST(pv2? false: true); BOOST_TEST(!pv2); BOOST_TEST(pv2.get() == 0); BOOST_TEST(pv2.use_count() == pv.use_count()); } { boost::shared_ptr<incomplete> px; boost::shared_ptr<incomplete> px2(px); BOOST_TEST(px2 == px); BOOST_TEST(px2? false: true); BOOST_TEST(!px2); BOOST_TEST(px2.get() == 0); BOOST_TEST(px2.use_count() == px.use_count()); 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() == px.use_count()); } { boost::shared_ptr<int> pi(static_cast<int*>(0)); boost::shared_ptr<int> pi2(pi); BOOST_TEST(pi2 == pi); BOOST_TEST(pi2? false: true); BOOST_TEST(!pi2); BOOST_TEST(pi2.get() == 0); BOOST_TEST(pi2.use_count() == 2); BOOST_TEST(!pi2.unique()); BOOST_TEST(pi2.use_count() == pi.use_count()); BOOST_TEST(!(pi < pi2 || pi2 < pi)); // shared ownership test boost::shared_ptr<void> pi3(pi); BOOST_TEST(pi3 == pi); BOOST_TEST(pi3? false: true); BOOST_TEST(!pi3); BOOST_TEST(pi3.get() == 0); BOOST_TEST(pi3.use_count() == 3); BOOST_TEST(!pi3.unique()); BOOST_TEST(pi3.use_count() == pi.use_count()); BOOST_TEST(!(pi < pi3 || pi3 < pi)); // shared ownership test boost::shared_ptr<void> pi4(pi2); BOOST_TEST(pi4 == pi2); BOOST_TEST(pi4? false: true); BOOST_TEST(!pi4); BOOST_TEST(pi4.get() == 0); BOOST_TEST(pi4.use_count() == 4); BOOST_TEST(!pi4.unique());
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?