| 
									
										
										
										
											2009-03-01 16:00:42 +00:00
										 |  |  | #ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 | 
					
						
							|  |  |  | #define BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-11-28 15:35:21 +00:00
										 |  |  | // MS compatible compilers support #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-12 17:09:24 +00:00
										 |  |  | #if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
					
						
							|  |  |  | # pragma once
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  detail/shared_count.hpp
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  | //  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
					
						
							| 
									
										
										
										
											2005-03-17 22:45:11 +00:00
										 |  |  | //  Copyright 2004-2005 Peter Dimov
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2004-07-26 00:32:12 +00:00
										 |  |  | // 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)
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-30 21:49:40 +00:00
										 |  |  | #ifdef __BORLANDC__
 | 
					
						
							|  |  |  | # pragma warn -8027     // Functions containing try are not expanded inline
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-01 18:40:35 +00:00
										 |  |  | #include <boost/config.hpp>
 | 
					
						
							|  |  |  | #include <boost/checked_delete.hpp>
 | 
					
						
							| 
									
										
										
										
											2002-08-14 12:27:22 +00:00
										 |  |  | #include <boost/throw_exception.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-03-01 16:00:42 +00:00
										 |  |  | #include <boost/smart_ptr/bad_weak_ptr.hpp>
 | 
					
						
							|  |  |  | #include <boost/smart_ptr/detail/sp_counted_base.hpp>
 | 
					
						
							|  |  |  | #include <boost/smart_ptr/detail/sp_counted_impl.hpp>
 | 
					
						
							| 
									
										
										
										
											2008-05-02 19:44:56 +00:00
										 |  |  | #include <boost/detail/workaround.hpp>
 | 
					
						
							| 
									
										
										
										
											2008-04-19 16:28:00 +00:00
										 |  |  | // In order to avoid circular dependencies with Boost.TR1
 | 
					
						
							|  |  |  | // we make sure that our include of <memory> doesn't try to
 | 
					
						
							|  |  |  | // pull in the TR1 headers: that's why we use this header 
 | 
					
						
							|  |  |  | // rather than including <memory> directly:
 | 
					
						
							|  |  |  | #include <boost/config/no_tr1/memory.hpp>  // std::auto_ptr
 | 
					
						
							| 
									
										
										
										
											2003-01-30 14:20:22 +00:00
										 |  |  | #include <functional>       // std::less
 | 
					
						
							| 
									
										
										
										
											2012-12-05 03:44:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef BOOST_NO_EXCEPTIONS
 | 
					
						
							|  |  |  | # include <new>              // std::bad_alloc
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-14 12:04:48 +00:00
										 |  |  | #if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
					
						
							|  |  |  | # include <boost/utility/addressof.hpp>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | namespace boost | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  | namespace detail | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2002-11-19 16:11:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  | int const shared_count_id = 0x2C35F101; | 
					
						
							|  |  |  | int const   weak_count_id = 0x298C38A4; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-12 14:27:22 +00:00
										 |  |  | struct sp_nothrow_tag {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-22 23:38:12 +00:00
										 |  |  | template< class D > struct sp_inplace_tag | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-14 12:04:48 +00:00
										 |  |  | #if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template< class T > class sp_reference_wrapper | 
					
						
							|  |  |  | {  | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     explicit sp_reference_wrapper( T & t): t_( boost::addressof( t ) ) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template< class Y > void operator()( Y * p ) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         (*t_)( p ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     T * t_; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template< class D > struct sp_convert_reference | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     typedef D type; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template< class D > struct sp_convert_reference< D& > | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     typedef sp_reference_wrapper< D > type; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-14 23:08:30 +00:00
										 |  |  | class weak_count; | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class shared_count | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-14 15:13:53 +00:00
										 |  |  |     sp_counted_base * pi_; | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  |     int id_; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     friend class weak_count; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 16:11:21 +00:00
										 |  |  |     shared_count(): pi_(0) // nothrow
 | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-02-15 13:31:58 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-03-17 23:30:47 +00:00
										 |  |  |     template<class Y> explicit shared_count( Y * p ): pi_( 0 ) | 
					
						
							|  |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							|  |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | #ifndef BOOST_NO_EXCEPTIONS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             pi_ = new sp_counted_impl_p<Y>( p ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         catch(...) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             boost::checked_delete( p ); | 
					
						
							|  |  |  |             throw; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pi_ = new sp_counted_impl_p<Y>( p ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if( pi_ == 0 ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             boost::checked_delete( p ); | 
					
						
							|  |  |  |             boost::throw_exception( std::bad_alloc() ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-01 16:50:39 +00:00
										 |  |  | #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1200 )
 | 
					
						
							|  |  |  |     template<class Y, class D> shared_count( Y * p, D d ): pi_(0) | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     template<class P, class D> shared_count( P p, D d ): pi_(0) | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-05-01 16:50:39 +00:00
										 |  |  | #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1200 )
 | 
					
						
							|  |  |  |         typedef Y* P; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-08-14 12:27:22 +00:00
										 |  |  | #ifndef BOOST_NO_EXCEPTIONS
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2005-03-17 23:05:26 +00:00
										 |  |  |             pi_ = new sp_counted_impl_pd<P, D>(p, d); | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         catch(...) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             d(p); // delete p
 | 
					
						
							|  |  |  |             throw; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-08-14 12:27:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-03-17 23:05:26 +00:00
										 |  |  |         pi_ = new sp_counted_impl_pd<P, D>(p, d); | 
					
						
							| 
									
										
										
										
											2002-08-14 12:27:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if(pi_ == 0) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             d(p); // delete p
 | 
					
						
							|  |  |  |             boost::throw_exception(std::bad_alloc()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-09 20:05:42 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-22 23:38:12 +00:00
										 |  |  | #if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template< class P, class D > shared_count( P p, sp_inplace_tag<D> ): pi_( 0 ) | 
					
						
							|  |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							|  |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | #ifndef BOOST_NO_EXCEPTIONS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             pi_ = new sp_counted_impl_pd< P, D >( p ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         catch( ... ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             D()( p ); // delete p
 | 
					
						
							|  |  |  |             throw; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pi_ = new sp_counted_impl_pd< P, D >( p ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if( pi_ == 0 ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             D()( p ); // delete p
 | 
					
						
							|  |  |  |             boost::throw_exception( std::bad_alloc() ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // #ifndef BOOST_NO_EXCEPTIONS
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-09 20:05:42 +00:00
										 |  |  |     template<class P, class D, class A> shared_count( P p, D d, A a ): pi_( 0 ) | 
					
						
							|  |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							|  |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         typedef sp_counted_impl_pda<P, D, A> impl_type; | 
					
						
							|  |  |  |         typedef typename A::template rebind< impl_type >::other A2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         A2 a2( a ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef BOOST_NO_EXCEPTIONS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) ); | 
					
						
							|  |  |  |             new( static_cast< void* >( pi_ ) ) impl_type( p, d, a ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         catch(...) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             d( p ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if( pi_ != 0 ) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 a2.deallocate( static_cast< impl_type* >( pi_ ), 1 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             throw; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if( pi_ != 0 ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             new( static_cast< void* >( pi_ ) ) impl_type( p, d, a ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             d( p ); | 
					
						
							|  |  |  |             boost::throw_exception( std::bad_alloc() ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-14 12:27:22 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-22 23:38:12 +00:00
										 |  |  | #if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template< class P, class D, class A > shared_count( P p, sp_inplace_tag< D >, A a ): pi_( 0 ) | 
					
						
							|  |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							|  |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         typedef sp_counted_impl_pda< P, D, A > impl_type; | 
					
						
							|  |  |  |         typedef typename A::template rebind< impl_type >::other A2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         A2 a2( a ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef BOOST_NO_EXCEPTIONS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) ); | 
					
						
							|  |  |  |             new( static_cast< void* >( pi_ ) ) impl_type( p, a ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         catch(...) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             D()( p ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if( pi_ != 0 ) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 a2.deallocate( static_cast< impl_type* >( pi_ ), 1 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             throw; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if( pi_ != 0 ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             new( static_cast< void* >( pi_ ) ) impl_type( p, a ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             D()( p ); | 
					
						
							|  |  |  |             boost::throw_exception( std::bad_alloc() ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // #ifndef BOOST_NO_EXCEPTIONS
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-01 18:40:35 +00:00
										 |  |  | #ifndef BOOST_NO_AUTO_PTR
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // auto_ptr<Y> is special cased to provide the strong guarantee
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-23 13:55:18 +00:00
										 |  |  |     template<class Y> | 
					
						
							| 
									
										
										
										
											2005-03-17 23:30:47 +00:00
										 |  |  |     explicit shared_count( std::auto_ptr<Y> & r ): pi_( new sp_counted_impl_p<Y>( r.get() ) ) | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-02-01 18:40:35 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-03-17 23:30:47 +00:00
										 |  |  | #ifdef BOOST_NO_EXCEPTIONS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if( pi_ == 0 ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             boost::throw_exception(std::bad_alloc()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-01 18:40:35 +00:00
										 |  |  |         r.release(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-14 12:04:48 +00:00
										 |  |  | #if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template<class Y, class D> | 
					
						
							|  |  |  |     explicit shared_count( std::unique_ptr<Y, D> & r ): pi_( 0 ) | 
					
						
							|  |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							|  |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         typedef typename sp_convert_reference<D>::type D2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         D2 d2( r.get_deleter() ); | 
					
						
							| 
									
										
											  
											
												Merged revision(s) 81149, 81159, 81171, 81174, 81219-81220, 81222-81224, 81226, 81229-81239, 81242, 81253, 81257-81262, 81265-81268, 81271-81272, 81275-81277, 81299-81300 from trunk:
Implement shared_ptr<X[]>, weak_ptr<X[]>. Refs #1113.
........
Fix shared_ptr<T[]> EDG issues.
........
Disable make_shared<T> overloads when T is Q[].
........
Add catch(...) clauses to sp_array_test.cpp.
........
Add allocate_shared and make_shared for shared_ptr arrays of runtime size. Fulfills need for allocate_shared_array and make_shared_array. 
........
Update Jamfile.v2 to run make_shared array tests and allocate_shared array tests.
........
Fix g++ issues.
........
Add specialization of sp_if_not_array<T[N]>.
........
Rename make_shared.hpp to make_shared_object.hpp, include from make_shared.hpp.
........
Add make_shared_array_args_test.cpp.
........
Add support for make_shared of array of arrays. Correctly destroy elements and construct elements for the variadic template constructor variants.
........
Fix sp_convertible<T const[], T const[]>.
........
Update smart_ptr/detail/array_helper to have create and create_noinit for non-array case.
........
Rename sp_convertible_test.cpp to shared_ptr_convertible_test.cpp.
........
Don't treat array_helper create and create_noinit for array types as a special case.
........
Add sp_convertible_test.cpp.
........
Fix array_helper (create_noinit and use of args...).
........
Update allocate_shared and make_shared to treat multidimensional array as single dimension. Remove detail array_helper. Add detail array traits. Update tests. 
........
Simplify array_deleter interface
........
Add missing semicolon.
........
Fix typo.
........
Add tests for variadic template constructors overload of array forms of make_shared and allocate_shared for multidimensional arrays and up to 9 constructor arguments.
........
Add support for shared_ptr<X[N>.
........
Add C++11 initializer list support for make_shared and allocate_shared array forms.
........
Clean up code in allocate_shared_array.hpp and make_shared_array.hpp
........
Change make_shared and allocate_shared array form semantics with initializer lists overload that takes no size.
........
Disable make_shared for arrays when the compiler doesn't support partial specialization or SFINAE.
........
For allocate_shared and make_shared: Separate test case that g++ does support yet. Remove macros testing for no partial specialization in traits. Add additional traits.
........
Actually remove test cases from make_shared_array_create_test.cpp and allocate_shared_array_create_test.cpp that g++ does not handle.
........
Add overloads to support fixed size arrays, T[N], to allocate_shared (variadic) and make_shared (variadic) and make_shared_noinit.
........
Add additional overload for make_shared and allocate_shared for arrays for fixed size arrays and initializer lists.
........
Add assertion to overload of make_shared and allocate_shared for T[N] with initializer lists. Rename detail type to be more intuitive.
........
Add allocate_shared_array_args_test.cpp.
........
Keep old definition of sp_assert_convertible when BOOST_SP_NO_SP_CONVERTIBLE is set.
........
Updated shared_array to match shared_ptr. Refs #1113.
........
Add final overload of make_shared and allocate_shared (array forms) for T[][N] with C++11 initializer lists.
........
Change traits for initializer list for g++
........
Tidy long line formatting in allocate_shared_array.hpp and make_shared_array.hpp
........
Update tests for make_shared and allocate_shared array forms, for normal case, initializer lists, variadic template arguments, for arrays and fixed size arrays.
........
Update Jamfile.v2 with two new smart_ptr tests for allocate_shared and make_shared
........
[SVN r81339]
											
										 
											2012-11-14 13:52:11 +00:00
										 |  |  |         pi_ = new sp_counted_impl_pd< typename std::unique_ptr<Y, D>::pointer, D2 >( r.get(), d2 ); | 
					
						
							| 
									
										
										
										
											2012-11-14 12:04:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef BOOST_NO_EXCEPTIONS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if( pi_ == 0 ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             boost::throw_exception( std::bad_alloc() ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         r.release(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     ~shared_count() // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-03-17 23:30:47 +00:00
										 |  |  |         if( pi_ != 0 ) pi_->release(); | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2003-01-27 14:02:00 +00:00
										 |  |  |         id_ = 0; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     shared_count(shared_count const & r): pi_(r.pi_) // nothrow
 | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-03-17 23:30:47 +00:00
										 |  |  |         if( pi_ != 0 ) pi_->add_ref_copy(); | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-22 19:48:39 +00:00
										 |  |  | #if defined( BOOST_HAS_RVALUE_REFS )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     shared_count(shared_count && r): pi_(r.pi_) // nothrow
 | 
					
						
							|  |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							|  |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         r.pi_ = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |     explicit shared_count(weak_count const & r); // throws bad_weak_ptr when r.use_count() == 0
 | 
					
						
							| 
									
										
										
										
											2008-04-12 14:27:22 +00:00
										 |  |  |     shared_count( weak_count const & r, sp_nothrow_tag ); // constructs an empty *this when r.use_count() == 0
 | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     shared_count & operator= (shared_count const & r) // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-01-14 15:13:53 +00:00
										 |  |  |         sp_counted_base * tmp = r.pi_; | 
					
						
							| 
									
										
										
										
											2004-02-10 23:17:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-03-17 23:30:47 +00:00
										 |  |  |         if( tmp != pi_ ) | 
					
						
							| 
									
										
										
										
											2004-02-10 23:17:12 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2005-03-17 23:30:47 +00:00
										 |  |  |             if( tmp != 0 ) tmp->add_ref_copy(); | 
					
						
							|  |  |  |             if( pi_ != 0 ) pi_->release(); | 
					
						
							| 
									
										
										
										
											2004-02-10 23:17:12 +00:00
										 |  |  |             pi_ = tmp; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return *this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void swap(shared_count & r) // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-01-14 15:13:53 +00:00
										 |  |  |         sp_counted_base * tmp = r.pi_; | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |         r.pi_ = pi_; | 
					
						
							|  |  |  |         pi_ = tmp; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     long use_count() const // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-01-13 18:32:16 +00:00
										 |  |  |         return pi_ != 0? pi_->use_count(): 0; | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool unique() const // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         return use_count() == 1; | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-12 14:27:22 +00:00
										 |  |  |     bool empty() const // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return pi_ == 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  |     friend inline bool operator==(shared_count const & a, shared_count const & b) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return a.pi_ == b.pi_; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     friend inline bool operator<(shared_count const & a, shared_count const & b) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-03-17 23:30:47 +00:00
										 |  |  |         return std::less<sp_counted_base *>()( a.pi_, b.pi_ ); | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-11-21 14:46:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-26 20:34:40 +00:00
										 |  |  |     void * get_deleter( sp_typeinfo const & ti ) const | 
					
						
							| 
									
										
										
										
											2002-11-21 14:46:45 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-03-17 23:30:47 +00:00
										 |  |  |         return pi_? pi_->get_deleter( ti ): 0; | 
					
						
							| 
									
										
										
										
											2002-11-21 14:46:45 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-12-13 14:57:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     void * get_untyped_deleter() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return pi_? pi_->get_untyped_deleter(): 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-20 11:08:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | class weak_count | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-14 15:13:53 +00:00
										 |  |  |     sp_counted_base * pi_; | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  |     int id_; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  |     friend class shared_count; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 16:11:21 +00:00
										 |  |  |     weak_count(): pi_(0) // nothrow
 | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  |         , id_(weak_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     weak_count(shared_count const & r): pi_(r.pi_) // nothrow
 | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2009-03-02 16:35:06 +00:00
										 |  |  |         , id_(weak_count_id) | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         if(pi_ != 0) pi_->weak_add_ref(); | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     weak_count(weak_count const & r): pi_(r.pi_) // nothrow
 | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2009-03-02 16:35:06 +00:00
										 |  |  |         , id_(weak_count_id) | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         if(pi_ != 0) pi_->weak_add_ref(); | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 23:21:15 +00:00
										 |  |  | // Move support
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined( BOOST_HAS_RVALUE_REFS )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     weak_count(weak_count && r): pi_(r.pi_) // nothrow
 | 
					
						
							|  |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							|  |  |  |         , id_(weak_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         r.pi_ = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     ~weak_count() // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-18 14:37:02 +00:00
										 |  |  |         if(pi_ != 0) pi_->weak_release(); | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2003-01-27 14:02:00 +00:00
										 |  |  |         id_ = 0; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     weak_count & operator= (shared_count const & r) // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-01-14 15:13:53 +00:00
										 |  |  |         sp_counted_base * tmp = r.pi_; | 
					
						
							| 
									
										
										
										
											2008-04-22 06:31:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if( tmp != pi_ ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if(tmp != 0) tmp->weak_add_ref(); | 
					
						
							|  |  |  |             if(pi_ != 0) pi_->weak_release(); | 
					
						
							|  |  |  |             pi_ = tmp; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return *this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     weak_count & operator= (weak_count const & r) // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-01-14 15:13:53 +00:00
										 |  |  |         sp_counted_base * tmp = r.pi_; | 
					
						
							| 
									
										
										
										
											2008-04-22 06:31:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if( tmp != pi_ ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if(tmp != 0) tmp->weak_add_ref(); | 
					
						
							|  |  |  |             if(pi_ != 0) pi_->weak_release(); | 
					
						
							|  |  |  |             pi_ = tmp; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return *this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void swap(weak_count & r) // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-01-14 15:13:53 +00:00
										 |  |  |         sp_counted_base * tmp = r.pi_; | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |         r.pi_ = pi_; | 
					
						
							|  |  |  |         pi_ = tmp; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     long use_count() const // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-11-21 13:14:04 +00:00
										 |  |  |         return pi_ != 0? pi_->use_count(): 0; | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-26 19:59:11 +00:00
										 |  |  |     bool empty() const // nothrow
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return pi_ == 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  |     friend inline bool operator==(weak_count const & a, weak_count const & b) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return a.pi_ == b.pi_; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     friend inline bool operator<(weak_count const & a, weak_count const & b) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2003-01-14 15:13:53 +00:00
										 |  |  |         return std::less<sp_counted_base *>()(a.pi_, b.pi_); | 
					
						
							| 
									
										
										
										
											2002-02-09 12:34:05 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-03-17 23:30:47 +00:00
										 |  |  | inline shared_count::shared_count( weak_count const & r ): pi_( r.pi_ ) | 
					
						
							| 
									
										
										
										
											2003-02-10 12:54:43 +00:00
										 |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							| 
									
										
										
										
											2003-01-07 15:34:56 +00:00
										 |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2005-03-17 22:45:11 +00:00
										 |  |  |     if( pi_ == 0 || !pi_->add_ref_lock() ) | 
					
						
							| 
									
										
										
										
											2002-11-21 13:14:04 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-03-17 22:45:11 +00:00
										 |  |  |         boost::throw_exception( boost::bad_weak_ptr() ); | 
					
						
							| 
									
										
										
										
											2002-11-21 13:14:04 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-02-12 16:55:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-12 14:27:22 +00:00
										 |  |  | inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ): pi_( r.pi_ ) | 
					
						
							|  |  |  | #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
					
						
							|  |  |  |         , id_(shared_count_id) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if( pi_ != 0 && !pi_->add_ref_lock() ) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         pi_ = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-22 13:38:52 +00:00
										 |  |  | } // namespace detail
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace boost
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-09 12:06:46 +00:00
										 |  |  | #ifdef __BORLANDC__
 | 
					
						
							|  |  |  | # pragma warn .8027     // Functions containing try are not expanded inline
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-01 16:00:42 +00:00
										 |  |  | #endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 |