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 + -
显示快捷键?