mirror of
https://github.com/boostorg/smart_ptr.git
synced 2025-08-01 05:34:36 +02:00
More tests added.
[SVN r16405]
This commit is contained in:
@@ -1109,7 +1109,7 @@ private:
|
|||||||
|
|
||||||
long X::instances = 0;
|
long X::instances = 0;
|
||||||
|
|
||||||
struct Y: public A, public X
|
struct Y: public A, public virtual X
|
||||||
{
|
{
|
||||||
static long instances;
|
static long instances;
|
||||||
|
|
||||||
@@ -1457,16 +1457,427 @@ void test()
|
|||||||
namespace n_reset
|
namespace n_reset
|
||||||
{
|
{
|
||||||
|
|
||||||
void plain_reset()
|
class incomplete;
|
||||||
|
|
||||||
|
incomplete * p0 = 0;
|
||||||
|
|
||||||
|
void deleter(incomplete *)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct X
|
||||||
|
{
|
||||||
|
static long instances;
|
||||||
|
|
||||||
|
X()
|
||||||
|
{
|
||||||
|
++instances;
|
||||||
|
}
|
||||||
|
|
||||||
|
~X()
|
||||||
|
{
|
||||||
|
--instances;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
X(X const &);
|
||||||
|
X & operator= (X const &);
|
||||||
|
};
|
||||||
|
|
||||||
|
long X::instances = 0;
|
||||||
|
|
||||||
|
void plain_reset()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
boost::shared_ptr<int> pi;
|
||||||
|
pi.reset();
|
||||||
|
BOOST_TEST(pi? false: true);
|
||||||
|
BOOST_TEST(!pi);
|
||||||
|
BOOST_TEST(pi.get() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
boost::shared_ptr<int> pi(static_cast<int*>(0));
|
||||||
|
pi.reset();
|
||||||
|
BOOST_TEST(pi? false: true);
|
||||||
|
BOOST_TEST(!pi);
|
||||||
|
BOOST_TEST(pi.get() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
boost::shared_ptr<int> pi(new int);
|
||||||
|
pi.reset();
|
||||||
|
BOOST_TEST(pi? false: true);
|
||||||
|
BOOST_TEST(!pi);
|
||||||
|
BOOST_TEST(pi.get() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
boost::shared_ptr<incomplete> px;
|
||||||
|
px.reset();
|
||||||
|
BOOST_TEST(px? false: true);
|
||||||
|
BOOST_TEST(!px);
|
||||||
|
BOOST_TEST(px.get() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
boost::shared_ptr<incomplete> px(p0, deleter);
|
||||||
|
px.reset();
|
||||||
|
BOOST_TEST(px? false: true);
|
||||||
|
BOOST_TEST(!px);
|
||||||
|
BOOST_TEST(px.get() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
boost::shared_ptr<X> px;
|
||||||
|
px.reset();
|
||||||
|
BOOST_TEST(px? false: true);
|
||||||
|
BOOST_TEST(!px);
|
||||||
|
BOOST_TEST(px.get() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
BOOST_TEST(X::instances == 0);
|
||||||
|
boost::shared_ptr<X> px(new X);
|
||||||
|
BOOST_TEST(X::instances == 1);
|
||||||
|
px.reset();
|
||||||
|
BOOST_TEST(px? false: true);
|
||||||
|
BOOST_TEST(!px);
|
||||||
|
BOOST_TEST(px.get() == 0);
|
||||||
|
BOOST_TEST(X::instances == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
boost::shared_ptr<void> pv;
|
||||||
|
pv.reset();
|
||||||
|
BOOST_TEST(pv? false: true);
|
||||||
|
BOOST_TEST(!pv);
|
||||||
|
BOOST_TEST(pv.get() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
BOOST_TEST(X::instances == 0);
|
||||||
|
boost::shared_ptr<void> pv(new X);
|
||||||
|
BOOST_TEST(X::instances == 1);
|
||||||
|
pv.reset();
|
||||||
|
BOOST_TEST(pv? false: true);
|
||||||
|
BOOST_TEST(!pv);
|
||||||
|
BOOST_TEST(pv.get() == 0);
|
||||||
|
BOOST_TEST(X::instances == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct A
|
||||||
|
{
|
||||||
|
int dummy;
|
||||||
|
};
|
||||||
|
|
||||||
|
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()
|
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()
|
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()
|
void test()
|
||||||
@@ -2393,8 +2804,65 @@ void test()
|
|||||||
namespace n_spt_intrusive
|
namespace n_spt_intrusive
|
||||||
{
|
{
|
||||||
|
|
||||||
|
int X_instances = 0;
|
||||||
|
|
||||||
|
struct X
|
||||||
|
{
|
||||||
|
long count;
|
||||||
|
|
||||||
|
X(): count(0)
|
||||||
|
{
|
||||||
|
++X_instances;
|
||||||
|
}
|
||||||
|
|
||||||
|
~X()
|
||||||
|
{
|
||||||
|
--X_instances;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void intrusive_ptr_add_ref(X * p)
|
||||||
|
{
|
||||||
|
++p->count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void intrusive_ptr_release(X * p)
|
||||||
|
{
|
||||||
|
if(--p->count == 0) delete p;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> struct intrusive_deleter
|
||||||
|
{
|
||||||
|
void operator()(T * p)
|
||||||
|
{
|
||||||
|
if(p != 0) intrusive_ptr_release(p);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
boost::shared_ptr<X> make_shared_from_intrusive(X * p)
|
||||||
|
{
|
||||||
|
if(p != 0) intrusive_ptr_add_ref(p);
|
||||||
|
boost::shared_ptr<X> px(p, intrusive_deleter<X>());
|
||||||
|
return px;
|
||||||
|
}
|
||||||
|
|
||||||
void test()
|
void test()
|
||||||
{
|
{
|
||||||
|
BOOST_TEST(X_instances == 0);
|
||||||
|
|
||||||
|
{
|
||||||
|
X * p = new X;
|
||||||
|
BOOST_TEST(X_instances == 1);
|
||||||
|
BOOST_TEST(p->count == 0);
|
||||||
|
boost::shared_ptr<X> px = make_shared_from_intrusive(p);
|
||||||
|
BOOST_TEST(px.get() == p);
|
||||||
|
BOOST_TEST(p->count == 1);
|
||||||
|
boost::shared_ptr<X> px2(px);
|
||||||
|
BOOST_TEST(px2.get() == p);
|
||||||
|
BOOST_TEST(p->count == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_TEST(X_instances == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace n_spt_intrusive
|
} // namespace n_spt_intrusive
|
||||||
|
Reference in New Issue
Block a user