shared_ptr_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 2,927 行 · 第 1/5 页

CPP
2,927
字号
    {        --instances;    }private:    X(X const &);    X & operator= (X const &);};long X::instances = 0;struct 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;void copy_assignment(){    {        boost::shared_ptr<incomplete> p1;        p1 = p1;        BOOST_TEST(p1 == p1);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        boost::shared_ptr<incomplete> p2;        p1 = p2;        BOOST_TEST(p1 == p2);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        boost::shared_ptr<incomplete> p3(p1);        p1 = p3;        BOOST_TEST(p1 == p3);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);    }    {        boost::shared_ptr<void> p1;        p1 = p1;        BOOST_TEST(p1 == p1);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        boost::shared_ptr<void> p2;        p1 = p2;        BOOST_TEST(p1 == p2);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        boost::shared_ptr<void> p3(p1);        p1 = p3;        BOOST_TEST(p1 == p3);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        boost::shared_ptr<void> p4(new int);        BOOST_TEST(p4.use_count() == 1);        p1 = p4;        BOOST_TEST(p1 == p4);        BOOST_TEST(!(p1 < p4 || p4 < p1));        BOOST_TEST(p1.use_count() == 2);        BOOST_TEST(p4.use_count() == 2);        p1 = p3;        BOOST_TEST(p1 == p3);        BOOST_TEST(p4.use_count() == 1);    }    {        boost::shared_ptr<X> p1;        p1 = p1;        BOOST_TEST(p1 == p1);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        boost::shared_ptr<X> p2;        p1 = p2;        BOOST_TEST(p1 == p2);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        boost::shared_ptr<X> p3(p1);        p1 = p3;        BOOST_TEST(p1 == p3);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        BOOST_TEST(X::instances == 0);        boost::shared_ptr<X> p4(new X);        BOOST_TEST(X::instances == 1);        p1 = p4;        BOOST_TEST(X::instances == 1);        BOOST_TEST(p1 == p4);        BOOST_TEST(!(p1 < p4 || p4 < p1));        BOOST_TEST(p1.use_count() == 2);        p1 = p2;        BOOST_TEST(p1 == p2);        BOOST_TEST(X::instances == 1);        p4 = p3;        BOOST_TEST(p4 == p3);        BOOST_TEST(X::instances == 0);    }}void conversion_assignment(){    {        boost::shared_ptr<void> p1;        boost::shared_ptr<incomplete> p2;        p1 = p2;        BOOST_TEST(p1 == p2);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        boost::shared_ptr<int> p4(new int);        BOOST_TEST(p4.use_count() == 1);        boost::shared_ptr<void> p5(p4);        BOOST_TEST(p4.use_count() == 2);        p1 = p4;        BOOST_TEST(p1 == p4);        BOOST_TEST(!(p1 < p5 || p5 < p1));        BOOST_TEST(p1.use_count() == 3);        BOOST_TEST(p4.use_count() == 3);        p1 = p2;        BOOST_TEST(p1 == p2);        BOOST_TEST(p4.use_count() == 2);    }    {        boost::shared_ptr<X> p1;        boost::shared_ptr<Y> p2;        p1 = p2;        BOOST_TEST(p1 == p2);        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        BOOST_TEST(X::instances == 0);        BOOST_TEST(Y::instances == 0);        boost::shared_ptr<Y> p4(new Y);        BOOST_TEST(X::instances == 1);        BOOST_TEST(Y::instances == 1);        BOOST_TEST(p4.use_count() == 1);        boost::shared_ptr<X> p5(p4);        BOOST_TEST(p4.use_count() == 2);        p1 = p4;        BOOST_TEST(X::instances == 1);        BOOST_TEST(Y::instances == 1);        BOOST_TEST(p1 == p4);        BOOST_TEST(!(p1 < p5 || p5 < p1));        BOOST_TEST(p1.use_count() == 3);        BOOST_TEST(p4.use_count() == 3);        p1 = p2;        BOOST_TEST(p1 == p2);        BOOST_TEST(X::instances == 1);        BOOST_TEST(Y::instances == 1);        BOOST_TEST(p4.use_count() == 2);        p4 = p2;        p5 = p2;        BOOST_TEST(p4 == p2);        BOOST_TEST(X::instances == 0);        BOOST_TEST(Y::instances == 0);    }}void auto_ptr_assignment(){    {        boost::shared_ptr<int> p1;        std::auto_ptr<int> p2;        p1 = p2;        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        BOOST_TEST(p1.use_count() == 1);        int * p = new int;        std::auto_ptr<int> p3(p);        p1 = p3;        BOOST_TEST(p1.get() == p);        BOOST_TEST(p1.use_count() == 1);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p3.get() == 0);#endif        p1 = p2;        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        BOOST_TEST(p1.use_count() == 1);    }    {        boost::shared_ptr<void> p1;        std::auto_ptr<int> p2;        p1 = p2;        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        BOOST_TEST(p1.use_count() == 1);        int * p = new int;        std::auto_ptr<int> p3(p);        p1 = p3;        BOOST_TEST(p1.get() == p);        BOOST_TEST(p1.use_count() == 1);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p3.get() == 0);#endif        p1 = p2;        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        BOOST_TEST(p1.use_count() == 1);    }    {        boost::shared_ptr<X> p1;        std::auto_ptr<Y> p2;        p1 = p2;        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        BOOST_TEST(p1.use_count() == 1);        BOOST_TEST(X::instances == 0);        BOOST_TEST(Y::instances == 0);        Y * p = new Y;        std::auto_ptr<Y> p3(p);        BOOST_TEST(X::instances == 1);        BOOST_TEST(Y::instances == 1);        p1 = p3;        BOOST_TEST(p1.get() == p);        BOOST_TEST(p1.use_count() == 1);        BOOST_TEST(X::instances == 1);        BOOST_TEST(Y::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p3.get() == 0);#endif        p1 = p2;        BOOST_TEST(p1? false: true);        BOOST_TEST(!p1);        BOOST_TEST(p1.get() == 0);        BOOST_TEST(p1.use_count() == 1);        BOOST_TEST(X::instances == 0);        BOOST_TEST(Y::instances == 0);    }}void test(){    copy_assignment();    conversion_assignment();    auto_ptr_assignment();}} // namespace n_assignmentnamespace n_reset{class incomplete;incomplete * p0 = 0;void deleter(incomplete *){}struct X{    static long instances;    X()    {        ++instances;    }    ~X()    {        --instances;    }private:    X(X const &);    X & operator= (X const &);};long X::instances = 0;void plain_reset(){    {        boost::shared_ptr<int> pi;        pi.reset();        BOOST_TEST(pi? false: true);        BOOST_TEST(!pi);        BOOST_TEST(pi.get() == 0);        BOOST_TEST(pi.use_count() == 0);    }    {        boost::shared_ptr<int> pi(static_cast<int*>(0));        pi.reset();        BOOST_TEST(pi? false: true);        BOOST_TEST(!pi);        BOOST_TEST(pi.get() == 0);        BOOST_TEST(pi.use_count() == 0);    }    {        boost::shared_ptr<int> pi(new int);        pi.reset();        BOOST_TEST(pi? false: true);        BOOST_TEST(!pi);        BOOST_TEST(pi.get() == 0);        BOOST_TEST(pi.use_count() == 0);    }    {        boost::shared_ptr<incomplete> px;        px.reset();        BOOST_TEST(px? false: true);        BOOST_TEST(!px);        BOOST_TEST(px.get() == 0);        BOOST_TEST(px.use_count() == 0);    }    {        boost::shared_ptr<incomplete> px(p0, deleter);        px.reset();        BOOST_TEST(px? false: true);        BOOST_TEST(!px);        BOOST_TEST(px.get() == 0);        BOOST_TEST(px.use_count() == 0);    }    {        boost::shared_ptr<X> px;        px.reset();        BOOST_TEST(px? false: true);        BOOST_TEST(!px);        BOOST_TEST(px.get() == 0);        BOOST_TEST(px.use_count() == 0);    }    {        BOOST_TEST(X::instances == 0);        boost::shared_ptr<X> px(new X);        BOOST_TEST(X::instances == 1);        px.reset();        BOOST_TEST(px? false: true);        BOOST_TEST(!px);        BOOST_TEST(px.get() == 0);        BOOST_TEST(px.use_count() == 0);        BOOST_TEST(X::instances == 0);    }    {        boost::shared_ptr<void> pv;        pv.reset();        BOOST_TEST(pv? false: true);        BOOST_TEST(!pv);        BOOST_TEST(pv.get() == 0);        BOOST_TEST(pv.use_count() == 0);    }    {        BOOST_TEST(X::instances == 0);        boost::shared_ptr<void> pv(new X);        BOOST_TEST(X::instances == 1);        pv.reset();        BOOST_TEST(pv? false: true);        BOOST_TEST(!pv);        BOOST_TEST(pv.get() == 0);        BOOST_TEST(pv.use_count() == 0);        BOOST_TEST(X::instances == 0);    }}struct A{    int dummy;};struct 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;void pointer_reset(){    {        boost::shared_ptr<int> pi;        pi.reset(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());        int * p = new int;        pi.reset(p);        BOOST_TEST(pi? true: false);        BOOST_TEST(!!pi);        BOOST_TEST(pi.get() == p);        BOOST_TEST(pi.use_count() == 1);        BOOST_TEST(pi.unique());        pi.reset(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<X> px;        px.reset(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_TEST(X::instances == 0);        X * p = new X;        px.reset(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);        px.reset(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_TEST(X::instances == 0);        BOOST_TEST(Y::instances == 0);        Y * q = new Y;        px.reset(q);        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);        px.reset(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_TEST(X::instances == 0);        BOOST_TEST(Y::instances == 0);    }    {        boost::shared_ptr<void> pv;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?