1 //////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Ion Gaztanaga 2005.
4 // Distributed under the Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
8 //////////////////////////////////////////////////////////////////////////////
10 #ifndef BOOST_POINTER_CAST_HPP
11 #define BOOST_POINTER_CAST_HPP
13 #include <boost/config.hpp>
17 //static_pointer_cast overload for raw pointers
18 template<class T
, class U
>
19 inline T
* static_pointer_cast(U
*ptr
)
21 return static_cast<T
*>(ptr
);
24 //dynamic_pointer_cast overload for raw pointers
25 template<class T
, class U
>
26 inline T
* dynamic_pointer_cast(U
*ptr
)
28 return dynamic_cast<T
*>(ptr
);
31 //const_pointer_cast overload for raw pointers
32 template<class T
, class U
>
33 inline T
* const_pointer_cast(U
*ptr
)
35 return const_cast<T
*>(ptr
);
38 //reinterpret_pointer_cast overload for raw pointers
39 template<class T
, class U
>
40 inline T
* reinterpret_pointer_cast(U
*ptr
)
42 return reinterpret_cast<T
*>(ptr
);
47 #if !defined( BOOST_NO_CXX11_SMART_PTR )
49 #include <boost/type_traits/has_virtual_destructor.hpp>
50 #include <boost/static_assert.hpp>
55 //static_pointer_cast overload for std::shared_ptr
56 using std::static_pointer_cast
;
58 //dynamic_pointer_cast overload for std::shared_ptr
59 using std::dynamic_pointer_cast
;
61 //const_pointer_cast overload for std::shared_ptr
62 using std::const_pointer_cast
;
64 //reinterpret_pointer_cast overload for std::shared_ptr
65 template<class T
, class U
> std::shared_ptr
<T
> reinterpret_pointer_cast(const std::shared_ptr
<U
> & r
) BOOST_NOEXCEPT
67 (void) reinterpret_cast< T
* >( static_cast< U
* >( 0 ) );
69 typedef typename
std::shared_ptr
<T
>::element_type E
;
71 E
* p
= reinterpret_cast< E
* >( r
.get() );
72 return std::shared_ptr
<T
>( r
, p
);
75 //static_pointer_cast overload for std::unique_ptr
76 template<class T
, class U
> std::unique_ptr
<T
> static_pointer_cast( std::unique_ptr
<U
> && r
) BOOST_NOEXCEPT
78 (void) static_cast< T
* >( static_cast< U
* >( 0 ) );
80 typedef typename
std::unique_ptr
<T
>::element_type E
;
82 return std::unique_ptr
<T
>( static_cast<E
*>( r
.release() ) );
85 //dynamic_pointer_cast overload for std::unique_ptr
86 template<class T
, class U
> std::unique_ptr
<T
> dynamic_pointer_cast( std::unique_ptr
<U
> && r
) BOOST_NOEXCEPT
88 (void) dynamic_cast< T
* >( static_cast< U
* >( 0 ) );
90 BOOST_STATIC_ASSERT_MSG( boost::has_virtual_destructor
<T
>::value
, "The target of dynamic_pointer_cast must have a virtual destructor." );
92 T
* p
= dynamic_cast<T
*>( r
.get() );
94 return std::unique_ptr
<T
>( p
);
97 //const_pointer_cast overload for std::unique_ptr
98 template<class T
, class U
> std::unique_ptr
<T
> const_pointer_cast( std::unique_ptr
<U
> && r
) BOOST_NOEXCEPT
100 (void) const_cast< T
* >( static_cast< U
* >( 0 ) );
102 typedef typename
std::unique_ptr
<T
>::element_type E
;
104 return std::unique_ptr
<T
>( const_cast<E
*>( r
.release() ) );
107 //reinterpret_pointer_cast overload for std::unique_ptr
108 template<class T
, class U
> std::unique_ptr
<T
> reinterpret_pointer_cast( std::unique_ptr
<U
> && r
) BOOST_NOEXCEPT
110 (void) reinterpret_cast< T
* >( static_cast< U
* >( 0 ) );
112 typedef typename
std::unique_ptr
<T
>::element_type E
;
114 return std::unique_ptr
<T
>( reinterpret_cast<E
*>( r
.release() ) );
119 #endif // #if !defined( BOOST_NO_CXX11_SMART_PTR )
121 #endif //BOOST_POINTER_CAST_HPP