From 40c42eb74009d213516185c5aaa00c4ce69fae8c Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Wed, 11 Jun 2014 11:44:02 +0400 Subject: [PATCH 1/8] cast.hpp was moved to the numeric_cast library --- include/boost/cast.hpp | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 include/boost/cast.hpp 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 From 8a03282736c447d549d6e02d002c0e05daf2140b Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 11 Jun 2014 14:35:27 +0300 Subject: [PATCH 2/8] Add additional tests. --- test/Jamfile.v2 | 3 +- test/implicit_cast_fail2.cpp | 19 +++++ test/polymorphic_cast_test.cpp | 150 +++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 test/implicit_cast_fail2.cpp create mode 100644 test/polymorphic_cast_test.cpp diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index f79e724..69f8b3c 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -27,5 +27,6 @@ test-suite conversion [ 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/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/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(); +} From 24d6ac1e87d309fb6ff36608155a0df346022904 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 11 Jun 2014 14:38:48 +0300 Subject: [PATCH 3/8] Remove unnecessary includes from polymorphic_cast.hpp. --- include/boost/polymorphic_cast.hpp | 3 --- 1 file changed, 3 deletions(-) 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 { From f0caf56d0b4ab7a97c4ebda07dbdeedb453c3e2c Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 11 Jun 2014 14:40:50 +0300 Subject: [PATCH 4/8] Remove unnecessary includes from implicit_cast_fail.cpp. --- test/implicit_cast_fail.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) 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; } - From df57f258076b427de788f5517a39c33756367f9b Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 11 Jun 2014 14:41:55 +0300 Subject: [PATCH 5/8] Remove unnecessary includes from cast_test.cpp. --- test/cast_test.cpp | 6 ------ 1 file changed, 6 deletions(-) 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; From 800c10a4eb5053f4c7e9aa0084d9272de1fe5cd3 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 11 Jun 2014 14:45:37 +0300 Subject: [PATCH 6/8] Remove use of mpl::identity from implicit_cast.hpp. --- include/boost/implicit_cast.hpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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; } From 6943537150588c56017162bca01701b68b69f5c8 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Wed, 11 Jun 2014 16:16:40 +0400 Subject: [PATCH 7/8] Drop dependency to the boost_unit_test_framework library in tests --- test/Jamfile.v2 | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 69f8b3c..4f10981 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 From ff7ea09a7345e91e4963093bc9edc05cae53c555 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Wed, 11 Jun 2014 16:23:51 +0400 Subject: [PATCH 8/8] remove numeric_cast_test that is a copy of numeric/conversion/test/numeric_cast_test.cpp --- test/Jamfile.v2 | 1 - test/numeric_cast_test.cpp | 101 ------------------------------------- 2 files changed, 102 deletions(-) delete mode 100644 test/numeric_cast_test.cpp diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 4f10981..c513ee8 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -24,7 +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/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 ; -}