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 = &pi;        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 + -
显示快捷键?