diff --git a/include/boost/cast.hpp b/include/boost/cast.hpp deleted file mode 100644 index ab452bd..0000000 --- a/include/boost/cast.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// boost cast.hpp header file -// -// (C) Copyright Antony Polukhin 2014. -// -// 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) -// -// See http://www.boost.org/libs/conversion for Documentation. - -// This is a DEPRECATED header file! -// Use or instead - -#ifndef BOOST_CAST_HPP -#define BOOST_CAST_HPP - -# include -# include - -#endif // BOOST_CAST_HPP diff --git a/include/boost/implicit_cast.hpp b/include/boost/implicit_cast.hpp index 5b1cd92..d82db76 100644 --- a/include/boost/implicit_cast.hpp +++ b/include/boost/implicit_cast.hpp @@ -5,17 +5,24 @@ #ifndef IMPLICIT_CAST_DWA200356_HPP # define IMPLICIT_CAST_DWA200356_HPP -# include - namespace boost { +namespace detail { + +template struct icast_identity +{ + typedef T type; +}; + +} // namespace detail + // implementation originally suggested by C. Green in // http://lists.boost.org/MailArchives/boost/msg00886.php // The use of identity creates a non-deduced form, so that the // explicit template argument must be supplied template -inline T implicit_cast (typename mpl::identity::type x) { +inline T implicit_cast (typename boost::detail::icast_identity::type x) { return x; } diff --git a/include/boost/polymorphic_cast.hpp b/include/boost/polymorphic_cast.hpp index f02d7ea..03013c7 100644 --- a/include/boost/polymorphic_cast.hpp +++ b/include/boost/polymorphic_cast.hpp @@ -48,9 +48,6 @@ # include # include # include -# include -# include -# include namespace boost { diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index f79e724..c513ee8 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -10,8 +10,6 @@ import feature ; project : requirements - /boost/test//boost_unit_test_framework - static gcc-4.7:-ftrapv gcc-4.6:-ftrapv clang:-ftrapv @@ -26,6 +24,6 @@ test-suite conversion : [ run implicit_cast.cpp ] [ compile-fail implicit_cast_fail.cpp ] [ run cast_test.cpp ] - [ run numeric_cast_test.cpp ] + [ run polymorphic_cast_test.cpp ] + [ compile-fail implicit_cast_fail2.cpp ] ; - diff --git a/test/cast_test.cpp b/test/cast_test.cpp index fa30df8..5295e32 100644 --- a/test/cast_test.cpp +++ b/test/cast_test.cpp @@ -14,14 +14,8 @@ // 3 Aug 99 Initial Version #include -#include -#include // for DBL_MAX (Peter Schmid) #include -# if SCHAR_MAX == LONG_MAX -# error "This test program doesn't work if SCHAR_MAX == LONG_MAX" -# endif - using namespace boost; using std::cout; diff --git a/test/implicit_cast_fail.cpp b/test/implicit_cast_fail.cpp index 442fa4c..86ccbb2 100644 --- a/test/implicit_cast_fail.cpp +++ b/test/implicit_cast_fail.cpp @@ -4,10 +4,6 @@ // http://www.boost.org/LICENSE_1_0.txt) #include -#include - -#define BOOST_INCLUDE_MAIN -#include using boost::implicit_cast; @@ -16,11 +12,9 @@ struct foo explicit foo(char const*) {} }; -int test_main(int, char*[]) +int main() { foo x = implicit_cast("foobar"); (void)x; // warning suppression. - BOOST_CHECK(false); // suppressing warning about 'boost::unit_test::{anonymous}::unit_test_log' defined but not used return 0; } - diff --git a/test/implicit_cast_fail2.cpp b/test/implicit_cast_fail2.cpp new file mode 100644 index 0000000..97cc2d8 --- /dev/null +++ b/test/implicit_cast_fail2.cpp @@ -0,0 +1,19 @@ +// +// Test that implicit_cast requires a template argument +// +// Copyright 2014 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 + +int main() +{ + int x = boost::implicit_cast( 1 ); + (void)x; + + return 0; +} diff --git a/test/numeric_cast_test.cpp b/test/numeric_cast_test.cpp deleted file mode 100644 index 015776d..0000000 --- a/test/numeric_cast_test.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// boost utility cast test program -----------------------------------------// - -// (C) Copyright Beman Dawes, Dave Abrahams 1999. 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) - -// See http://www.boost.org for most recent version including documentation. - -// Revision History -// 28 Set 04 factored out numeric_cast<> test (Fernando Cacciola) -// 20 Jan 01 removed use of for portability to raw GCC (David Abrahams) -// 28 Jun 00 implicit_cast removed (Beman Dawes) -// 30 Aug 99 value_cast replaced by numeric_cast -// 3 Aug 99 Initial Version - -#include -#include -#include // for DBL_MAX (Peter Schmid) -#include - -#include "boost/test/minimal.hpp" - -# if SCHAR_MAX == LONG_MAX -# error "This test program doesn't work if SCHAR_MAX == LONG_MAX" -# endif - -using namespace boost; -using std::cout; - - -int test_main( int , char * [] ) -{ - -# ifdef NDEBUG - cout << "NDEBUG is defined\n"; -# else - cout << "NDEBUG is not defined\n"; -# endif - - cout << "\nBeginning tests...\n"; - -// test implicit_cast and numeric_cast -------------------------------------// - - // tests which should succeed - long small_value = 1; - long small_negative_value = -1; - long large_value = LONG_MAX; - long large_negative_value = LONG_MIN; - signed char c = 0; - - c = static_cast(large_value); - - c = numeric_cast( small_value ); - BOOST_CHECK( c == 1 ); - c = 0; - c = numeric_cast( small_value ); - BOOST_CHECK( c == 1 ); - c = 0; - c = numeric_cast( small_negative_value ); - BOOST_CHECK( c == -1 ); - - // These tests courtesy of Joe R NWP Swatosh - BOOST_CHECK( 0.0f == numeric_cast( 0.0 ) ); - BOOST_CHECK( 0.0 == numeric_cast( 0.0 ) ); - - // tests which should result in errors being detected - - bool caught_exception = false; - try { c = numeric_cast( large_value ); } - catch (bad_numeric_cast) - { cout<<"caught bad_numeric_cast #1\n"; caught_exception = true; } - BOOST_CHECK ( caught_exception ); - - caught_exception = false; - try { c = numeric_cast( large_negative_value ); } - catch (bad_numeric_cast) - { cout<<"caught bad_numeric_cast #2\n"; caught_exception = true; } - BOOST_CHECK ( caught_exception ); - - unsigned long ul; - caught_exception = false; - try { ul = numeric_cast( large_negative_value ); } - catch (bad_numeric_cast) - { cout<<"caught bad_numeric_cast #3\n"; caught_exception = true; } - BOOST_CHECK ( caught_exception ); - - caught_exception = false; - try { ul = numeric_cast( small_negative_value ); } - catch (bad_numeric_cast) - { cout<<"caught bad_numeric_cast #4\n"; caught_exception = true; } - BOOST_CHECK ( caught_exception ); - - caught_exception = false; - try { numeric_cast( DBL_MAX ); } - catch (bad_numeric_cast) - { cout<<"caught bad_numeric_cast #5\n"; caught_exception = true; } - BOOST_CHECK ( caught_exception ); - - (void)ul; // Supressing GCC warning about set but unused wariable - return 0 ; -} diff --git a/test/polymorphic_cast_test.cpp b/test/polymorphic_cast_test.cpp new file mode 100644 index 0000000..b3f1397 --- /dev/null +++ b/test/polymorphic_cast_test.cpp @@ -0,0 +1,150 @@ +// +// Test boost::polymorphic_cast, boost::polymorphic_downcast +// +// Copyright 1999 Beman Dawes +// Copyright 1999 Dave Abrahams +// Copyright 2014 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 +// + +#define BOOST_ENABLE_ASSERT_HANDLER +#include +#include +#include + +static bool expect_assertion = false; +static int assertion_failed_count = 0; + +// BOOST_ASSERT custom handler +void boost::assertion_failed( char const * expr, char const * function, char const * file, long line ) +{ + if( expect_assertion ) + { + ++assertion_failed_count; + } + else + { + BOOST_ERROR( "unexpected assertion" ); + + BOOST_LIGHTWEIGHT_TEST_OSTREAM + << file << "(" << line << "): assertion '" << expr << "' failed in function '" + << function << "'" << std::endl; + } +} + +// + +struct Base +{ + virtual ~Base() {} + virtual std::string kind() { return "Base"; } +}; + +struct Base2 +{ + virtual ~Base2() {} + virtual std::string kind2() { return "Base2"; } +}; + +struct Derived : public Base, Base2 +{ + virtual std::string kind() { return "Derived"; } +}; + +static void test_polymorphic_cast() +{ + Base * base = new Derived; + + Derived * derived; + + try + { + derived = boost::polymorphic_cast( base ); + + BOOST_TEST( derived != 0 ); + + if( derived != 0 ) + { + BOOST_TEST_EQ( derived->kind(), "Derived" ); + } + } + catch( std::bad_cast const& ) + { + BOOST_ERROR( "boost::polymorphic_cast( base ) threw std::bad_cast" ); + } + + Base2 * base2; + + try + { + base2 = boost::polymorphic_cast( base ); // crosscast + + BOOST_TEST( base2 != 0 ); + + if( base2 != 0 ) + { + BOOST_TEST_EQ( base2->kind2(), "Base2" ); + } + } + catch( std::bad_cast const& ) + { + BOOST_ERROR( "boost::polymorphic_cast( base ) threw std::bad_cast" ); + } + + delete base; +} + +static void test_polymorphic_downcast() +{ + Base * base = new Derived; + + Derived * derived = boost::polymorphic_downcast( base ); + + BOOST_TEST( derived != 0 ); + + if( derived != 0 ) + { + BOOST_TEST_EQ( derived->kind(), "Derived" ); + } + + // polymorphic_downcast can't do crosscasts + + delete base; +} + +static void test_polymorphic_cast_fail() +{ + Base * base = new Base; + + BOOST_TEST_THROWS( boost::polymorphic_cast( base ), std::bad_cast ); + + delete base; +} + +static void test_polymorphic_downcast_fail() +{ + Base * base = new Base; + + int old_count = assertion_failed_count; + expect_assertion = true; + + boost::polymorphic_downcast( base ); // should assert + + BOOST_TEST_EQ( assertion_failed_count, old_count + 1 ); + expect_assertion = false; + + delete base; +} + +int main() +{ + test_polymorphic_cast(); + test_polymorphic_downcast(); + test_polymorphic_cast_fail(); + test_polymorphic_downcast_fail(); + + return boost::report_errors(); +}