⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 weak_ptr_test.cpp

📁 boost库提供标准的C++ API 配合dev c++使用,功能更加强大
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }

    {
        boost::shared_ptr<Z> sp(static_cast<Z*>(0));
        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));
    }

    {
        boost::shared_ptr<Z> sp(new Z);
        boost::weak_ptr<Z> wp(sp);

        boost::weak_ptr<X> 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<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_constructors

namespace 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()
{
    copy_assignment(boost::shared_ptr<int>(new int));
    copy_assignment(boost::shared_ptr<X>(new X));
    copy_assignment(boost::shared_ptr<void>(new int));
    copy_assignment(create_incomplete());
    conversion_assignment();
    shared_ptr_assignment<int>(boost::shared_ptr<int>(new int));
    shared_ptr_assignment<void>(boost::shared_ptr<int>(new int));
    shared_ptr_assignment<X>(boost::shared_ptr<X>(new X));
    shared_ptr_assignment<void>(boost::shared_ptr<X>(new X));
    shared_ptr_assignment<void>(boost::shared_ptr<void>(new int));
    shared_ptr_assignment<incomplete>(create_incomplete());
    shared_ptr_assignment<void>(create_incomplete());
}

} // namespace n_assignment

namespace 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()
{
    test2<int>(boost::shared_ptr<int>(new int));
    test2<void>(boost::shared_ptr<int>(new int));
    test2<X>(boost::shared_ptr<X>(new X));
    test2<void>(boost::shared_ptr<X>(new X));
    test2<void>(boost::shared_ptr<void>(new int));
    test2<incomplete>(create_incomplete());
    test2<void>(create_incomplete());
}

} // namespace n_reset

namespace 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_count

namespace 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);
        BOOST_TEST(!(wp < wp3 || wp3 < wp));

        using std::swap;
        swap(wp, wp2);

        BOOST_TEST(wp.use_count() == 0);
        BOOST_TEST(wp2.use_count() == 0);
        BOOST_TEST(!(wp2 < wp3 || wp3 < wp2));
    }

    {
        boost::shared_ptr<X> sp(new X);
        boost::shared_ptr<X> sp2(new X);
        boost::weak_ptr<X> wp(sp);
        boost::weak_ptr<X> wp2(sp2);
        boost::weak_ptr<X> wp3(sp2);

        wp.swap(wp2);

        BOOST_TEST(wp.use_count() == 1);
        BOOST_TEST(wp2.use_count() == 1);
        BOOST_TEST(!(wp < wp3 || wp3 < wp));

⌨️ 快捷键说明

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