📄 weak_ptr_test.cpp
字号:
}
{
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 + -