| 
									
										
										
										
											2005-12-06 13:26:13 +00:00
										 |  |  | //////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2008-07-12 14:47:13 +00:00
										 |  |  | // (C) Copyright Ion Gaztanaga 2005. 
 | 
					
						
							| 
									
										
										
										
											2005-12-06 13:26:13 +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)
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef BOOST_POINTER_CAST_HPP
 | 
					
						
							|  |  |  | #define BOOST_POINTER_CAST_HPP
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-25 02:45:57 +03:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2024-10-02 21:18:08 +03:00
										 |  |  | #include <type_traits>
 | 
					
						
							| 
									
										
										
										
											2016-09-10 17:55:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-06 13:26:13 +00:00
										 |  |  | namespace boost {  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //static_pointer_cast overload for raw pointers
 | 
					
						
							|  |  |  | template<class T, class U> | 
					
						
							| 
									
										
										
										
											2024-10-02 21:16:36 +03:00
										 |  |  | inline T* static_pointer_cast(U *ptr) noexcept | 
					
						
							| 
									
										
										
										
											2005-12-06 13:26:13 +00:00
										 |  |  | {   | 
					
						
							|  |  |  |    return static_cast<T*>(ptr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //dynamic_pointer_cast overload for raw pointers
 | 
					
						
							|  |  |  | template<class T, class U> | 
					
						
							| 
									
										
										
										
											2024-10-02 21:16:36 +03:00
										 |  |  | inline T* dynamic_pointer_cast(U *ptr) noexcept | 
					
						
							| 
									
										
										
										
											2005-12-06 13:26:13 +00:00
										 |  |  | {   | 
					
						
							|  |  |  |    return dynamic_cast<T*>(ptr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //const_pointer_cast overload for raw pointers
 | 
					
						
							|  |  |  | template<class T, class U> | 
					
						
							| 
									
										
										
										
											2024-10-02 21:16:36 +03:00
										 |  |  | inline T* const_pointer_cast(U *ptr) noexcept | 
					
						
							| 
									
										
										
										
											2005-12-06 13:26:13 +00:00
										 |  |  | {   | 
					
						
							|  |  |  |    return const_cast<T*>(ptr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //reinterpret_pointer_cast overload for raw pointers
 | 
					
						
							|  |  |  | template<class T, class U> | 
					
						
							| 
									
										
										
										
											2024-10-02 21:16:36 +03:00
										 |  |  | inline T* reinterpret_pointer_cast(U *ptr) noexcept | 
					
						
							| 
									
										
										
										
											2005-12-06 13:26:13 +00:00
										 |  |  | {   | 
					
						
							|  |  |  |    return reinterpret_cast<T*>(ptr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-17 13:47:00 +01:00
										 |  |  | //static_pointer_cast overload for std::shared_ptr
 | 
					
						
							|  |  |  | using std::static_pointer_cast; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //dynamic_pointer_cast overload for std::shared_ptr
 | 
					
						
							|  |  |  | using std::dynamic_pointer_cast; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //const_pointer_cast overload for std::shared_ptr
 | 
					
						
							|  |  |  | using std::const_pointer_cast; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //reinterpret_pointer_cast overload for std::shared_ptr
 | 
					
						
							| 
									
										
										
										
											2024-10-02 21:16:36 +03:00
										 |  |  | template<class T, class U> std::shared_ptr<T> reinterpret_pointer_cast(const std::shared_ptr<U> & r ) noexcept | 
					
						
							| 
									
										
										
										
											2015-12-17 13:47:00 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) ); | 
					
						
							| 
									
										
										
										
											2015-12-17 13:47:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     typedef typename std::shared_ptr<T>::element_type E; | 
					
						
							| 
									
										
										
										
											2015-12-17 13:47:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     E * p = reinterpret_cast< E* >( r.get() ); | 
					
						
							|  |  |  |     return std::shared_ptr<T>( r, p ); | 
					
						
							| 
									
										
										
										
											2015-12-17 13:47:00 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-17 15:32:30 +01:00
										 |  |  | //static_pointer_cast overload for std::unique_ptr
 | 
					
						
							| 
									
										
										
										
											2024-10-02 21:16:36 +03:00
										 |  |  | template<class T, class U> std::unique_ptr<T> static_pointer_cast( std::unique_ptr<U> && r ) noexcept | 
					
						
							| 
									
										
										
										
											2015-12-17 15:32:30 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     (void) static_cast< T* >( static_cast< U* >( 0 ) ); | 
					
						
							| 
									
										
										
										
											2016-09-10 17:55:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     typedef typename std::unique_ptr<T>::element_type E; | 
					
						
							| 
									
										
										
										
											2016-09-10 17:55:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     return std::unique_ptr<T>( static_cast<E*>( r.release() ) ); | 
					
						
							| 
									
										
										
										
											2015-12-17 15:32:30 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //dynamic_pointer_cast overload for std::unique_ptr
 | 
					
						
							| 
									
										
										
										
											2024-10-02 21:16:36 +03:00
										 |  |  | template<class T, class U> std::unique_ptr<T> dynamic_pointer_cast( std::unique_ptr<U> && r ) noexcept | 
					
						
							| 
									
										
										
										
											2015-12-17 15:32:30 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     (void) dynamic_cast< T* >( static_cast< U* >( 0 ) ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-02 21:18:08 +03:00
										 |  |  |     static_assert( std::has_virtual_destructor<T>::value, "The target of dynamic_pointer_cast must have a virtual destructor." ); | 
					
						
							| 
									
										
										
										
											2015-12-17 15:32:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     T * p = dynamic_cast<T*>( r.get() ); | 
					
						
							|  |  |  |     if( p ) r.release(); | 
					
						
							|  |  |  |     return std::unique_ptr<T>( p ); | 
					
						
							| 
									
										
										
										
											2015-12-17 15:32:30 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //const_pointer_cast overload for std::unique_ptr
 | 
					
						
							| 
									
										
										
										
											2024-10-02 21:16:36 +03:00
										 |  |  | template<class T, class U> std::unique_ptr<T> const_pointer_cast( std::unique_ptr<U> && r ) noexcept | 
					
						
							| 
									
										
										
										
											2015-12-17 15:32:30 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     (void) const_cast< T* >( static_cast< U* >( 0 ) ); | 
					
						
							| 
									
										
										
										
											2016-09-10 17:55:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     typedef typename std::unique_ptr<T>::element_type E; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return std::unique_ptr<T>( const_cast<E*>( r.release() ) ); | 
					
						
							| 
									
										
										
										
											2015-12-17 15:32:30 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //reinterpret_pointer_cast overload for std::unique_ptr
 | 
					
						
							| 
									
										
										
										
											2024-10-02 21:16:36 +03:00
										 |  |  | template<class T, class U> std::unique_ptr<T> reinterpret_pointer_cast( std::unique_ptr<U> && r ) noexcept | 
					
						
							| 
									
										
										
										
											2015-12-17 15:32:30 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     typedef typename std::unique_ptr<T>::element_type E; | 
					
						
							| 
									
										
										
										
											2016-09-10 17:55:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-10 18:43:22 +03:00
										 |  |  |     return std::unique_ptr<T>( reinterpret_cast<E*>( r.release() ) ); | 
					
						
							| 
									
										
										
										
											2015-12-17 15:32:30 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-17 13:47:00 +01:00
										 |  |  | } // namespace boost
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-06 13:26:13 +00:00
										 |  |  | #endif   //BOOST_POINTER_CAST_HPP
 |