// Copyright 2021 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include #include struct Y { static int instances; bool deleted_; Y(): deleted_( false ) { ++instances; } ~Y() { BOOST_TEST( deleted_ ); --instances; } private: Y( Y const & ); Y & operator=( Y const & ); }; int Y::instances = 0; struct YD { bool moved_; YD(): moved_( false ) { } YD( YD&& r ): moved_( false ) { r.moved_ = true; } void operator()( Y* p ) const { BOOST_TEST( !moved_ ); if( p ) { p->deleted_ = true; delete p; } } private: YD( YD const & ); YD & operator=( YD const & ); }; int main() { BOOST_TEST( Y::instances == 0 ); { YD del; boost::shared_ptr p( new Y, std::move( del ) ); BOOST_TEST( Y::instances == 1 ); BOOST_TEST( del.moved_ ); p.reset( new Y, YD() ); BOOST_TEST( Y::instances == 1 ); p = boost::shared_ptr( new Y, YD() ); BOOST_TEST( Y::instances == 1 ); YD del2; p.reset( new Y, std::move( del2 ) ); BOOST_TEST( Y::instances == 1 ); BOOST_TEST( del2.moved_ ); p.reset(); BOOST_TEST( Y::instances == 0 ); } { YD del; boost::shared_ptr p( new Y, std::move( del ), std::allocator() ); BOOST_TEST( Y::instances == 1 ); BOOST_TEST( del.moved_ ); p.reset( new Y, YD(), std::allocator() ); BOOST_TEST( Y::instances == 1 ); p = boost::shared_ptr( new Y, YD(), std::allocator() ); BOOST_TEST( Y::instances == 1 ); YD del2; p.reset( new Y, std::move( del2 ), std::allocator() ); BOOST_TEST( Y::instances == 1 ); BOOST_TEST( del2.moved_ ); p.reset(); BOOST_TEST( Y::instances == 0 ); } { boost::shared_ptr p( nullptr, YD() ); YD del; p = boost::shared_ptr( nullptr, std::move( del ) ); BOOST_TEST( del.moved_ ); } { boost::shared_ptr p( nullptr, YD(), std::allocator() ); YD del; p = boost::shared_ptr( nullptr, std::move( del ), std::allocator() ); BOOST_TEST( del.moved_ ); } return boost::report_errors(); }