// // pointer_cast_test2.cpp - a test for unique_ptr casts // // Copyright 2016 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 #if defined( BOOST_NO_CXX11_SMART_PTR ) int main() { return 0; } #else #include #include #include struct B1 { }; struct D1: B1 { ~D1() { } }; static void test_static_cast() { { std::unique_ptr p1( new int ); int * q1 = p1.get(); std::unique_ptr p2 = boost::static_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); } { std::unique_ptr p1( new int ); int * q1 = p1.get(); std::unique_ptr p2 = boost::static_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); } { std::unique_ptr p1( new int[ 1 ] ); int * q1 = p1.get(); std::unique_ptr p2 = boost::static_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); } { std::unique_ptr p1( new int[ 1 ] ); int * q1 = p1.get(); std::unique_ptr p2 = boost::static_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); } { std::unique_ptr p1( new D1 ); D1 * q1 = p1.get(); std::unique_ptr p2 = boost::static_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); std::unique_ptr p3 = boost::static_pointer_cast( std::move( p2 ) ); BOOST_TEST( p2.get() == 0 ); BOOST_TEST_EQ( p3.get(), q1 ); } } static void test_const_cast() { { std::unique_ptr p1( new int ); int * q1 = p1.get(); std::unique_ptr p2 = boost::const_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); std::unique_ptr p3 = boost::const_pointer_cast( std::move( p2 ) ); BOOST_TEST( p2.get() == 0 ); BOOST_TEST_EQ( p3.get(), q1 ); } { std::unique_ptr p1( new int[ 1 ] ); int * q1 = p1.get(); std::unique_ptr p2 = boost::const_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); std::unique_ptr p3 = boost::const_pointer_cast( std::move( p2 ) ); BOOST_TEST( p2.get() == 0 ); BOOST_TEST_EQ( p3.get(), q1 ); } } struct B2 { virtual ~B2() { } }; struct C2 { virtual ~C2() { } }; struct D2: B2, C2 { }; static void test_dynamic_cast() { { std::unique_ptr p1( new D2 ); D2 * q1 = p1.get(); std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); } { std::unique_ptr p1( new D2 ); B2 * q1 = p1.get(); std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); } { std::unique_ptr p1( new B2 ); B2 * q1 = p1.get(); std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); BOOST_TEST( p2.get() == 0 ); BOOST_TEST_EQ( p1.get(), q1 ); } { D2 * q1 = new D2; std::unique_ptr p1( q1 ); std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); } } static void test_reinterpret_cast() { { std::unique_ptr p1( new int ); void * q1 = p1.get(); std::unique_ptr p2 = boost::reinterpret_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); p1 = boost::reinterpret_pointer_cast( std::move( p2 ) ); BOOST_TEST( p2.get() == 0 ); BOOST_TEST_EQ( p1.get(), q1 ); } { std::unique_ptr p1( new int ); void * q1 = p1.get(); std::unique_ptr p2 = boost::reinterpret_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); p1 = boost::reinterpret_pointer_cast( std::move( p2 ) ); BOOST_TEST( p2.get() == 0 ); BOOST_TEST_EQ( p1.get(), q1 ); } { std::unique_ptr p1( new int[ 1 ] ); void * q1 = p1.get(); std::unique_ptr p2 = boost::reinterpret_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); p1 = boost::reinterpret_pointer_cast( std::move( p2 ) ); BOOST_TEST( p2.get() == 0 ); BOOST_TEST_EQ( p1.get(), q1 ); } } int main() { test_static_cast(); test_const_cast(); test_dynamic_cast(); test_reinterpret_cast(); return boost::report_errors(); } #endif