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 + -
显示快捷键?