#include <type_traits>
template < typename T>
T* pointer_cast_impl( void * const p)
{
return static_cast < T* > ( p) ;
}
template < typename T>
T const * pointer_cast_impl( void const * const p)
{
return static_cast < T const * > ( p) ;
}
template < typename T>
T volatile * pointer_cast_impl( void volatile * const p)
{
return static_cast < T volatile * > ( p) ;
}
template < typename T>
T const volatile * pointer_cast_impl( void const volatile * const p)
{
return static_cast < T const volatile * > ( p) ;
}
template < typename T, typename U>
auto pointer_cast( U* const p) - > decltype( ( pointer_cast_impl< T> ) ( p) )
{
static_assert( std:: is_standard_layout < T> ( )
&& std:: is_standard_layout < U> ( ) ,
"T and U must both be standard layout types" ) ;
static_assert( alignof( T) <= alignof( U) ,
"T must not have stricter alignment than U" ) ;
return ( pointer_cast_impl< T> ) ( p) ;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KVCogcG9pbnRlcl9jYXN0X2ltcGwodm9pZCogY29uc3QgcCkKewogICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihwKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KVCBjb25zdCogcG9pbnRlcl9jYXN0X2ltcGwodm9pZCBjb25zdCogY29uc3QgcCkKewogICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgY29uc3QqPihwKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KVCB2b2xhdGlsZSogcG9pbnRlcl9jYXN0X2ltcGwodm9pZCB2b2xhdGlsZSogY29uc3QgcCkKewogICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgdm9sYXRpbGUqPihwKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KVCBjb25zdCB2b2xhdGlsZSogcG9pbnRlcl9jYXN0X2ltcGwodm9pZCBjb25zdCB2b2xhdGlsZSogY29uc3QgcCkKewogICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgY29uc3Qgdm9sYXRpbGUqPihwKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KYXV0byBwb2ludGVyX2Nhc3QoVSogY29uc3QgcCkgLT4gZGVjbHR5cGUoKHBvaW50ZXJfY2FzdF9pbXBsPFQ+KShwKSkKewogICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDxUPigpCiAgICAJCQkgICYmIHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFU+KCksCiAgICAgICAgICAgICAgICAgICJUIGFuZCBVIG11c3QgYm90aCBiZSBzdGFuZGFyZCBsYXlvdXQgdHlwZXMiKTsKICAgIHN0YXRpY19hc3NlcnQoYWxpZ25vZihUKSA8PSBhbGlnbm9mKFUpLAogICAgCQkJICAiVCBtdXN0IG5vdCBoYXZlIHN0cmljdGVyIGFsaWdubWVudCB0aGFuIFUiKTsKICAgIHJldHVybiAocG9pbnRlcl9jYXN0X2ltcGw8VD4pKHApOwp9