shared_ptr_test.cpp

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

CPP
2,927
字号
        BOOST_TEST(!(pvx < pvz || pvz < pvx));        BOOST_TEST(!(pvy < pvz || pvz < pvy));    }}} // namespace n_comparisonnamespace n_static_cast{struct X{};struct Y: public X{};void test(){    {        boost::shared_ptr<void> pv;        boost::shared_ptr<int> pi = boost::static_pointer_cast<int>(pv);        BOOST_TEST(pi.get() == 0);        boost::shared_ptr<X> px = boost::static_pointer_cast<X>(pv);        BOOST_TEST(px.get() == 0);    }    {        boost::shared_ptr<int> pi(new int);        boost::shared_ptr<void> pv(pi);        boost::shared_ptr<int> pi2 = boost::static_pointer_cast<int>(pv);        BOOST_TEST(pi.get() == pi2.get());        BOOST_TEST(!(pi < pi2 || pi2 < pi));        BOOST_TEST(pi.use_count() == 3);        BOOST_TEST(pv.use_count() == 3);        BOOST_TEST(pi2.use_count() == 3);    }    {        boost::shared_ptr<X> px(new X);        boost::shared_ptr<void> pv(px);        boost::shared_ptr<X> px2 = boost::static_pointer_cast<X>(pv);        BOOST_TEST(px.get() == px2.get());        BOOST_TEST(!(px < px2 || px2 < px));        BOOST_TEST(px.use_count() == 3);        BOOST_TEST(pv.use_count() == 3);        BOOST_TEST(px2.use_count() == 3);    }    {        boost::shared_ptr<X> px(new Y);        boost::shared_ptr<Y> py = boost::static_pointer_cast<Y>(px);        BOOST_TEST(px.get() == py.get());        BOOST_TEST(px.use_count() == 2);        BOOST_TEST(py.use_count() == 2);        boost::shared_ptr<X> px2(py);        BOOST_TEST(!(px < px2 || px2 < px));    }}} // namespace n_static_castnamespace n_const_cast{struct X;void test(){    {        boost::shared_ptr<void const volatile> px;        boost::shared_ptr<void> px2 = boost::const_pointer_cast<void>(px);        BOOST_TEST(px2.get() == 0);    }    {        boost::shared_ptr<int const volatile> px;        boost::shared_ptr<int> px2 = boost::const_pointer_cast<int>(px);        BOOST_TEST(px2.get() == 0);    }    {        boost::shared_ptr<X const volatile> px;        boost::shared_ptr<X> px2 = boost::const_pointer_cast<X>(px);        BOOST_TEST(px2.get() == 0);    }    {        boost::shared_ptr<void const volatile> px(new int);        boost::shared_ptr<void> px2 = boost::const_pointer_cast<void>(px);        BOOST_TEST(px.get() == px2.get());        BOOST_TEST(!(px < px2 || px2 < px));        BOOST_TEST(px.use_count() == 2);        BOOST_TEST(px2.use_count() == 2);    }    {        boost::shared_ptr<int const volatile> px(new int);        boost::shared_ptr<int> px2 = boost::const_pointer_cast<int>(px);        BOOST_TEST(px.get() == px2.get());        BOOST_TEST(!(px < px2 || px2 < px));        BOOST_TEST(px.use_count() == 2);        BOOST_TEST(px2.use_count() == 2);    }}} // namespace n_const_castnamespace n_dynamic_cast{struct V{    virtual ~V() {}};struct W: public V{};void test(){    {        boost::shared_ptr<V> pv;        boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(pv);        BOOST_TEST(pw.get() == 0);    }    {        boost::shared_ptr<V> pv(static_cast<V*>(0));        boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(pv);        BOOST_TEST(pw.get() == 0);        boost::shared_ptr<V> pv2(pw);        BOOST_TEST(pv < pv2 || pv2 < pv);    }    {        boost::shared_ptr<V> pv(static_cast<W*>(0));        boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(pv);        BOOST_TEST(pw.get() == 0);        boost::shared_ptr<V> pv2(pw);        BOOST_TEST(pv < pv2 || pv2 < pv);    }    {        boost::shared_ptr<V> pv(new V);        boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(pv);        BOOST_TEST(pw.get() == 0);        boost::shared_ptr<V> pv2(pw);        BOOST_TEST(pv < pv2 || pv2 < pv);    }    {        boost::shared_ptr<V> pv(new W);        boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(pv);        BOOST_TEST(pw.get() == pv.get());        BOOST_TEST(pv.use_count() == 2);        BOOST_TEST(pw.use_count() == 2);        boost::shared_ptr<V> pv2(pw);        BOOST_TEST(!(pv < pv2 || pv2 < pv));    }}} // namespace n_dynamic_castnamespace n_map{struct X{};void test(){    std::vector< boost::shared_ptr<int> > vi;    {        boost::shared_ptr<int> pi1(new int);        boost::shared_ptr<int> pi2(new int);        boost::shared_ptr<int> pi3(new int);        vi.push_back(pi1);        vi.push_back(pi1);        vi.push_back(pi1);        vi.push_back(pi2);        vi.push_back(pi1);        vi.push_back(pi2);        vi.push_back(pi1);        vi.push_back(pi3);        vi.push_back(pi3);        vi.push_back(pi2);        vi.push_back(pi1);    }    std::vector< boost::shared_ptr<X> > vx;    {        boost::shared_ptr<X> px1(new X);        boost::shared_ptr<X> px2(new X);        boost::shared_ptr<X> px3(new X);        vx.push_back(px2);        vx.push_back(px2);        vx.push_back(px1);        vx.push_back(px2);        vx.push_back(px1);        vx.push_back(px1);        vx.push_back(px1);        vx.push_back(px2);        vx.push_back(px1);        vx.push_back(px3);        vx.push_back(px2);    }    std::map< boost::shared_ptr<void>, long > m;    {        for(std::vector< boost::shared_ptr<int> >::iterator i = vi.begin(); i != vi.end(); ++i)        {            ++m[*i];        }    }    {        for(std::vector< boost::shared_ptr<X> >::iterator i = vx.begin(); i != vx.end(); ++i)        {            ++m[*i];        }    }    {        for(std::map< boost::shared_ptr<void>, long >::iterator i = m.begin(); i != m.end(); ++i)        {            BOOST_TEST(i->first.use_count() == i->second + 1);        }    }}} // namespace n_mapnamespace n_transitive{struct X{    X(): next() {}    boost::shared_ptr<X> next;};void test(){    boost::shared_ptr<X> p(new X);    p->next = boost::shared_ptr<X>(new X);    BOOST_TEST(!p->next->next);    p = p->next;    BOOST_TEST(!p->next);}} // namespace n_transitivenamespace n_report_1{class foo{ public:     foo(): m_self(this)    {    }     void suicide()    {        m_self.reset();    }private:    boost::shared_ptr<foo> m_self;}; void test(){    foo * foo_ptr = new foo;    foo_ptr->suicide();} } // namespace n_report_1// Test case by Per Kristensennamespace n_report_2{class foo{public:    void setWeak(boost::shared_ptr<foo> s)    {        w = s;    }private:    boost::weak_ptr<foo> w;}; class deleter{public:    deleter(): lock(0)    {    }    ~deleter()    {        BOOST_TEST(lock == 0);    }    void operator() (foo * p)    {        ++lock;        delete p;        --lock;    } private:    int lock;}; void test(){    boost::shared_ptr<foo> s(new foo, deleter());    s->setWeak(s);    s.reset();}} // namespace n_report_2namespace n_spt_incomplete{class file;boost::shared_ptr<file> fopen(char const * name, char const * mode);void fread(boost::shared_ptr<file> f, void * data, long size);int file_instances = 0;void test(){    BOOST_TEST(file_instances == 0);    {        boost::shared_ptr<file> pf = fopen("name", "mode");        BOOST_TEST(file_instances == 1);        fread(pf, 0, 17041);    }    BOOST_TEST(file_instances == 0);}} // namespace n_spt_incompletenamespace n_spt_pimpl{class file{private:    class impl;    boost::shared_ptr<impl> pimpl_;public:    file(char const * name, char const * mode);    // compiler generated members are fine and useful    void read(void * data, long size);    long total_size() const;};int file_instances = 0;void test(){    BOOST_TEST(file_instances == 0);    {        file f("name", "mode");        BOOST_TEST(file_instances == 1);        f.read(0, 152);        file f2(f);        BOOST_TEST(file_instances == 1);        f2.read(0, 894);        BOOST_TEST(f.total_size() == 152+894);        {            file f3("name2", "mode2");            BOOST_TEST(file_instances == 2);        }        BOOST_TEST(file_instances == 1);    }    BOOST_TEST(file_instances == 0);}} // namespace n_spt_pimplnamespace n_spt_abstract{class X{public:    virtual void f(int) = 0;    virtual int g() = 0;protected:    ~X() {}};boost::shared_ptr<X> createX();int X_instances = 0;void test(){    BOOST_TEST(X_instances == 0);    {        boost::shared_ptr<X> px = createX();        BOOST_TEST(X_instances == 1);        px->f(18);        px->f(152);        BOOST_TEST(px->g() == 170);    }    BOOST_TEST(X_instances == 0);}} // namespace n_spt_abstractnamespace n_spt_preventing_delete{int X_instances = 0;class X{private:    X()    {        ++X_instances;    }    ~X()    {        --X_instances;    }    class deleter;    friend class deleter;    class deleter    {    public:        void operator()(X * p) { delete p; }    };public:    static boost::shared_ptr<X> create()    {        boost::shared_ptr<X> px(new X, X::deleter());        return px;    }};void test(){    BOOST_TEST(X_instances == 0);    {        boost::shared_ptr<X> px = X::create();        BOOST_TEST(X_instances == 1);    }    BOOST_TEST(X_instances == 0);}} // namespace n_spt_preventing_deletenamespace n_spt_array{int X_instances = 0;struct X{    X()    {        ++X_instances;    }    ~X()    {        --X_instances;    }};void test(){    BOOST_TEST(X_instances == 0);    {        boost::shared_ptr<X> px(new X[4], boost::checked_array_deleter<X>());        BOOST_TEST(X_instances == 4);    }    BOOST_TEST(X_instances == 0);}} // namespace n_spt_arraynamespace n_spt_static{class X{public:    X()    {    }private:    void operator delete(void *)    {        // Comeau 4.3.0.1 wants a definition        BOOST_ERROR("n_spt_static::X::operator delete() called.");    }};struct null_deleter{    void o

⌨️ 快捷键说明

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