weak_ptr_test.cpp

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

CPP
1,369
字号
        BOOST_TEST(wp2.use_count() == wp.use_count());        BOOST_TEST(wp2.use_count() == 1);        BOOST_TEST(!(wp < wp2 || wp2 < wp));        sp.reset();        BOOST_TEST(!(wp < wp2 || wp2 < wp));        boost::weak_ptr<X> wp3(wp);        BOOST_TEST(wp3.use_count() == wp.use_count());        BOOST_TEST(wp3.use_count() == 0);        BOOST_TEST(!(wp < wp3 || wp3 < wp));    }    {        boost::shared_ptr<Z> sp(new Z);        boost::weak_ptr<Z> wp(sp);        boost::weak_ptr<Y> wp2(wp);        BOOST_TEST(wp2.use_count() == wp.use_count());        BOOST_TEST(wp2.use_count() == 1);        BOOST_TEST(!(wp < wp2 || wp2 < wp));        sp.reset();        BOOST_TEST(!(wp < wp2 || wp2 < wp));        boost::weak_ptr<Y> wp3(wp);        BOOST_TEST(wp3.use_count() == wp.use_count());        BOOST_TEST(wp3.use_count() == 0);        BOOST_TEST(!(wp < wp3 || wp3 < wp));    }}void test(){    default_constructor();    shared_ptr_constructor();    copy_constructor();    conversion_constructor();}} // namespace n_constructorsnamespace n_assignment{template<class T> void copy_assignment(boost::shared_ptr<T> & sp){    BOOST_TEST(sp.unique());    boost::weak_ptr<T> p1;    p1 = p1;    BOOST_TEST(p1.use_count() == 0);    boost::weak_ptr<T> p2;    p1 = p2;    BOOST_TEST(p1.use_count() == 0);    boost::weak_ptr<T> p3(p1);    p1 = p3;    BOOST_TEST(p1.use_count() == 0);    boost::weak_ptr<T> p4(sp);    p4 = p4;    BOOST_TEST(p4.use_count() == 1);    p1 = p4;    BOOST_TEST(p1.use_count() == 1);    p4 = p2;    BOOST_TEST(p4.use_count() == 0);    sp.reset();    p1 = p1;    BOOST_TEST(p1.use_count() == 0);    p4 = p1;    BOOST_TEST(p4.use_count() == 0);}void conversion_assignment(){    {        boost::weak_ptr<void> p1;        boost::weak_ptr<incomplete> p2;        p1 = p2;        BOOST_TEST(p1.use_count() == 0);        boost::shared_ptr<incomplete> sp = create_incomplete();        boost::weak_ptr<incomplete> p3(sp);        p1 = p3;        BOOST_TEST(p1.use_count() == 1);        sp.reset();        p1 = p3;        BOOST_TEST(p1.use_count() == 0);        p1 = p2;        BOOST_TEST(p1.use_count() == 0);    }    {        boost::weak_ptr<X> p1;        boost::weak_ptr<Z> p2;        p1 = p2;        BOOST_TEST(p1.use_count() == 0);        boost::shared_ptr<Z> sp(new Z);        boost::weak_ptr<Z> p3(sp);        p1 = p3;        BOOST_TEST(p1.use_count() == 1);        sp.reset();        p1 = p3;        BOOST_TEST(p1.use_count() == 0);        p1 = p2;        BOOST_TEST(p1.use_count() == 0);    }    {        boost::weak_ptr<Y> p1;        boost::weak_ptr<Z> p2;        p1 = p2;        BOOST_TEST(p1.use_count() == 0);        boost::shared_ptr<Z> sp(new Z);        boost::weak_ptr<Z> p3(sp);        p1 = p3;        BOOST_TEST(p1.use_count() == 1);        sp.reset();        p1 = p3;        BOOST_TEST(p1.use_count() == 0);        p1 = p2;        BOOST_TEST(p1.use_count() == 0);    }}template<class T, class U> void shared_ptr_assignment(boost::shared_ptr<U> & sp, T * = 0){    BOOST_TEST(sp.unique());    boost::weak_ptr<T> p1;    boost::weak_ptr<T> p2(p1);    boost::weak_ptr<T> p3(sp);    boost::weak_ptr<T> p4(p3);    p1 = sp;    BOOST_TEST(p1.use_count() == 1);    p2 = sp;    BOOST_TEST(p2.use_count() == 1);    p3 = sp;    BOOST_TEST(p3.use_count() == 1);    p4 = sp;    BOOST_TEST(p4.use_count() == 1);    sp.reset();    BOOST_TEST(p1.use_count() == 0);    BOOST_TEST(p2.use_count() == 0);    BOOST_TEST(p3.use_count() == 0);    BOOST_TEST(p4.use_count() == 0);    p1 = sp;}void test(){    {        boost::shared_ptr<int> p( new int );        copy_assignment( p );    }    {        boost::shared_ptr<X> p( new X );        copy_assignment( p );    }    {        boost::shared_ptr<void> p( new int );        copy_assignment( p );    }    {        boost::shared_ptr<incomplete> p = create_incomplete();        copy_assignment( p );    }    conversion_assignment();    {        boost::shared_ptr<int> p( new int );        shared_ptr_assignment<int>( p );    }    {        boost::shared_ptr<int> p( new int );        shared_ptr_assignment<void>( p );    }    {        boost::shared_ptr<X> p( new X );        shared_ptr_assignment<X>( p );    }    {        boost::shared_ptr<X> p( new X );        shared_ptr_assignment<void>( p );    }    {        boost::shared_ptr<void> p( new int );        shared_ptr_assignment<void>( p );    }    {        boost::shared_ptr<incomplete> p = create_incomplete();        shared_ptr_assignment<incomplete>( p );    }    {        boost::shared_ptr<incomplete> p = create_incomplete();        shared_ptr_assignment<void>( p );    }}} // namespace n_assignmentnamespace n_reset{template<class T, class U> void test2( boost::shared_ptr<U> & sp, T * = 0 ){    BOOST_TEST(sp.unique());    boost::weak_ptr<T> p1;    boost::weak_ptr<T> p2(p1);    boost::weak_ptr<T> p3(sp);    boost::weak_ptr<T> p4(p3);    boost::weak_ptr<T> p5(sp);    boost::weak_ptr<T> p6(p5);    p1.reset();    BOOST_TEST(p1.use_count() == 0);    p2.reset();    BOOST_TEST(p2.use_count() == 0);    p3.reset();    BOOST_TEST(p3.use_count() == 0);    p4.reset();    BOOST_TEST(p4.use_count() == 0);    sp.reset();    p5.reset();    BOOST_TEST(p5.use_count() == 0);    p6.reset();    BOOST_TEST(p6.use_count() == 0);}void test(){    {        boost::shared_ptr<int> p( new int );        test2<int>( p );    }    {        boost::shared_ptr<int> p( new int );        test2<void>( p );    }    {        boost::shared_ptr<X> p( new X );        test2<X>( p );    }    {        boost::shared_ptr<X> p( new X );        test2<void>( p );    }    {        boost::shared_ptr<void> p( new int );        test2<void>( p );    }    {        boost::shared_ptr<incomplete> p = create_incomplete();        test2<incomplete>( p );    }    {        boost::shared_ptr<incomplete> p = create_incomplete();        test2<void>( p );    }}} // namespace n_resetnamespace n_use_count{void test(){    {        boost::weak_ptr<X> wp;        BOOST_TEST(wp.use_count() == 0);        BOOST_TEST(wp.expired());        boost::weak_ptr<X> wp2;        BOOST_TEST(wp.use_count() == 0);        BOOST_TEST(wp.expired());        boost::weak_ptr<X> wp3(wp);        BOOST_TEST(wp.use_count() == 0);        BOOST_TEST(wp.expired());        BOOST_TEST(wp3.use_count() == 0);        BOOST_TEST(wp3.expired());    }    {        boost::shared_ptr<X> sp(static_cast<X*>(0));        boost::weak_ptr<X> wp(sp);        BOOST_TEST(wp.use_count() == 1);        BOOST_TEST(!wp.expired());        boost::weak_ptr<X> wp2(sp);        BOOST_TEST(wp.use_count() == 1);        BOOST_TEST(!wp.expired());        boost::weak_ptr<X> wp3(wp);        BOOST_TEST(wp.use_count() == 1);        BOOST_TEST(!wp.expired());        BOOST_TEST(wp3.use_count() == 1);        BOOST_TEST(!wp3.expired());        boost::shared_ptr<X> sp2(sp);        BOOST_TEST(wp.use_count() == 2);        BOOST_TEST(!wp.expired());        BOOST_TEST(wp2.use_count() == 2);        BOOST_TEST(!wp2.expired());        BOOST_TEST(wp3.use_count() == 2);        BOOST_TEST(!wp3.expired());        boost::shared_ptr<void> sp3(sp);        BOOST_TEST(wp.use_count() == 3);        BOOST_TEST(!wp.expired());        BOOST_TEST(wp2.use_count() == 3);        BOOST_TEST(!wp2.expired());        BOOST_TEST(wp3.use_count() == 3);        BOOST_TEST(!wp3.expired());        sp.reset();        BOOST_TEST(wp.use_count() == 2);        BOOST_TEST(!wp.expired());        BOOST_TEST(wp2.use_count() == 2);        BOOST_TEST(!wp2.expired());        BOOST_TEST(wp3.use_count() == 2);        BOOST_TEST(!wp3.expired());        sp2.reset();        BOOST_TEST(wp.use_count() == 1);        BOOST_TEST(!wp.expired());        BOOST_TEST(wp2.use_count() == 1);        BOOST_TEST(!wp2.expired());        BOOST_TEST(wp3.use_count() == 1);        BOOST_TEST(!wp3.expired());        sp3.reset();        BOOST_TEST(wp.use_count() == 0);        BOOST_TEST(wp.expired());        BOOST_TEST(wp2.use_count() == 0);        BOOST_TEST(wp2.expired());        BOOST_TEST(wp3.use_count() == 0);        BOOST_TEST(wp3.expired());    }}} // namespace n_use_countnamespace n_swap{void test(){    {        boost::weak_ptr<X> wp;        boost::weak_ptr<X> wp2;        wp.swap(wp2);        BOOST_TEST(wp.use_count() == 0);        BOOST_TEST(wp2.use_count() == 0);        using std::swap;        swap(wp, wp2);        BOOST_TEST(wp.use_count() == 0);        BOOST_TEST(wp2.use_count() == 0);    }    {        boost::shared_ptr<X> sp(new X);        boost::weak_ptr<X> wp;        boost::weak_ptr<X> wp2(sp);        boost::weak_ptr<X> wp3(sp);        wp.swap(wp2);        BOOST_TEST(wp.use_count() == 1);        BOOST_TEST(wp2.use_count() == 0);        BOOST_TEST(!(wp < wp3 || wp3 < wp));        using std::swap;        swap(wp, wp2);        BOOST_TEST(wp.use_count() == 0);        BOOST_TEST(wp2.use_count() == 1);        BOOST_TEST(!(wp2 < wp3 || wp3 < wp2));        sp.reset();        wp.swap(wp2);        BOOST_TEST(wp.use_count() == 0);        BOOST_TEST(wp2.use_count() == 0);

⌨️ 快捷键说明

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