/
BirdLeon
/
ROBLOX2016
Обзор
Документация
Войти
/
BirdLeon
/
ROBLOX2016
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
Library/boost/libs/smart_ptr/test/weak_ptr_alias_test.cpp
202 строки
5 KB
PatoFlamejanteTV
full source code
19 дек 2024, 19:11
19 дек 2024, 19:11
05db15d
Код
Авторство
О чём код?
// weak_ptr_alias_test.cpp // // Copyright 2007, 2019 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include <boost/core/lightweight_test.hpp> #include <boost/weak_ptr.hpp> #include <boost/shared_ptr.hpp> #include <memory> #include <cstddef> // class incomplete; struct X { int v_; explicit X( int v ): v_( v ) { } ~X() { v_ = 0; } }; template<class P1, class P2> bool share_ownership( P1 const& p1, P2 const& p2 ) { return !p1.owner_before( p2 ) && !p2.owner_before( p1 ); } int main() { { boost::shared_ptr<double> p( new double ); float m = 0; boost::weak_ptr<float> p2( p, &m ); BOOST_TEST( p2.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p2 ) ); BOOST_TEST( p2.lock().get() == &m ); { int m2 = 0; boost::weak_ptr<int> p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr<int const> p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr<int volatile> p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr<void> p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr<void> p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr<void const volatile> p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr<void const volatile> p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } } { boost::shared_ptr<incomplete> p; float m = 0; boost::weak_ptr<float> p2( p, &m ); BOOST_TEST( p2.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p2 ) ); { int m2 = 0; boost::weak_ptr<int> p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr<int const> p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr<int volatile> p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr<void> p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr<void> p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr<void const volatile> p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr<void const volatile> p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } } { boost::shared_ptr<X> p( new X( 5 ) ); boost::weak_ptr<int const> p2( p, &p->v_ ); BOOST_TEST( p2.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p2 ) ); BOOST_TEST( p2.lock().get() == &p->v_ ); p.reset(); BOOST_TEST( p2.expired() ); } return boost::report_errors(); }