📄 shared_ptr_test.cpp
字号:
};
struct Y: public A, public virtual X
{
static long instances;
Y()
{
++instances;
}
~Y()
{
--instances;
}
private:
Y(Y const &);
Y & operator= (Y const &);
};
long Y::instances = 0;
void pointer_reset()
{
{
boost::shared_ptr<int> pi;
pi.reset(static_cast<int*>(0));
BOOST_TEST(pi? false: true);
BOOST_TEST(!pi);
BOOST_TEST(pi.get() == 0);
BOOST_TEST(pi.use_count() == 1);
BOOST_TEST(pi.unique());
int * p = new int;
pi.reset(p);
BOOST_TEST(pi? true: false);
BOOST_TEST(!!pi);
BOOST_TEST(pi.get() == p);
BOOST_TEST(pi.use_count() == 1);
BOOST_TEST(pi.unique());
pi.reset(static_cast<int*>(0));
BOOST_TEST(pi? false: true);
BOOST_TEST(!pi);
BOOST_TEST(pi.get() == 0);
BOOST_TEST(pi.use_count() == 1);
BOOST_TEST(pi.unique());
}
{
boost::shared_ptr<X> px;
px.reset(static_cast<X*>(0));
BOOST_TEST(px? false: true);
BOOST_TEST(!px);
BOOST_TEST(px.get() == 0);
BOOST_TEST(px.use_count() == 1);
BOOST_TEST(px.unique());
BOOST_TEST(X::instances == 0);
X * p = new X;
px.reset(p);
BOOST_TEST(px? true: false);
BOOST_TEST(!!px);
BOOST_TEST(px.get() == p);
BOOST_TEST(px.use_count() == 1);
BOOST_TEST(px.unique());
BOOST_TEST(X::instances == 1);
px.reset(static_cast<X*>(0));
BOOST_TEST(px? false: true);
BOOST_TEST(!px);
BOOST_TEST(px.get() == 0);
BOOST_TEST(px.use_count() == 1);
BOOST_TEST(px.unique());
BOOST_TEST(X::instances == 0);
BOOST_TEST(Y::instances == 0);
Y * q = new Y;
px.reset(q);
BOOST_TEST(px? true: false);
BOOST_TEST(!!px);
BOOST_TEST(px.get() == q);
BOOST_TEST(px.use_count() == 1);
BOOST_TEST(px.unique());
BOOST_TEST(X::instances == 1);
BOOST_TEST(Y::instances == 1);
px.reset(static_cast<Y*>(0));
BOOST_TEST(px? false: true);
BOOST_TEST(!px);
BOOST_TEST(px.get() == 0);
BOOST_TEST(px.use_count() == 1);
BOOST_TEST(px.unique());
BOOST_TEST(X::instances == 0);
BOOST_TEST(Y::instances == 0);
}
{
boost::shared_ptr<void> pv;
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 = π
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_reset
namespace 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_access
namespace 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_count
namespace 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_swap
namespace n_comparison
{
struct X
{
int dummy;
};
struct Y
{
int dummy2;
};
struct Z: public X, public virtual Y
{
};
void test()
{
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -