// // sp_accept_owner_test.cpp // // Copyright (c) 2008 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 #include #include namespace N { struct D; struct X { X * px_; D * pd_; void * pv_; X(): px_( 0 ), pd_( 0 ), pv_( 0 ) { } }; struct D { template void operator()( T * p ) const { delete p; } }; } // namespace N #if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) namespace N { #else namespace boost { #endif template inline void sp_accept_owner( boost::shared_ptr * ps, ::N::X * px ) { std::cout << "sp_accept_owner( " << ps << ", " << px << " )\n"; BOOST_TEST( ps->get() == px ); if( px != 0 ) { px->px_ = px; } } template inline void sp_accept_owner( boost::shared_ptr * ps, ::N::X * px, ::N::D * pd ) { std::cout << "sp_accept_owner( " << ps << ", " << px << ", (D*)" << pd << " )\n"; BOOST_TEST( ps->get() == px ); if( px != 0 ) { px->px_ = px; px->pd_ = pd; } } template inline void sp_accept_owner( boost::shared_ptr * ps, ::N::X * px, void * pv ) { std::cout << "sp_accept_owner( " << ps << ", " << px << ", (void*)" << pv << " )\n"; BOOST_TEST( ps->get() == px ); if( px != 0 ) { px->px_ = px; px->pv_ = pv; } } } // namespace N or boost struct D2 { template void operator()( T * p ) const { delete p; } }; template void test( T* = 0 ) { { boost::shared_ptr p( static_cast< T* >( 0 ) ); } { T * p = new T; boost::shared_ptr q( p ); BOOST_TEST( q->px_ == p ); BOOST_TEST( q->pd_ == 0 ); BOOST_TEST( q->pv_ == 0 ); } { T * p = new T; boost::shared_ptr q( p, N::D() ); BOOST_TEST( q->px_ == p ); BOOST_TEST( q->pd_ != 0 ); BOOST_TEST( q->pv_ == 0 ); } { T * p = new T; boost::shared_ptr q( p, D2() ); BOOST_TEST( q->px_ == p ); BOOST_TEST( q->pd_ == 0 ); BOOST_TEST( q->pv_ != 0 ); } } namespace N2 { struct Y: public virtual N::X { }; } // namespace N2 int main() { test(); test(); return boost::report_errors(); }