// 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 # if SCHAR_MAX == LONG_MAX # error "This test program doesn't work if SCHAR_MAX == LONG_MAX" # endif using namespace boost; using std::cout; namespace { struct Base { virtual char kind() { return 'B'; } }; struct Base2 { virtual char kind2() { return '2'; } }; struct Derived : public Base, Base2 { virtual char kind() { return 'D'; } }; } int main( int argc, char * argv[] ) { # ifdef NDEBUG cout << "NDEBUG is defined\n"; # else cout << "NDEBUG is not defined\n"; # endif cout << "\nBeginning tests...\n"; // test polymorphic_cast ---------------------------------------------------// // tests which should succeed Base * base = new Derived; Base2 * base2 = 0; Derived * derived = 0; derived = polymorphic_downcast( base ); // downcast assert( derived->kind() == 'D' ); derived = 0; derived = polymorphic_cast( base ); // downcast, throw on error assert( derived->kind() == 'D' ); base2 = polymorphic_cast( base ); // crosscast assert( base2->kind2() == '2' ); // tests which should result in errors being detected int err_count = 0; base = new Base; if ( argc > 1 && *argv[1] == '1' ) { derived = polymorphic_downcast( base ); } // #1 assert failure bool caught_exception = false; try { derived = polymorphic_cast( base ); } catch (std::bad_cast) { cout<<"caught bad_cast\n"; caught_exception = true; } if ( !caught_exception ) ++err_count; // the following is just so generated code can be inspected if ( derived->kind() == 'B' ) ++err_count; cout << err_count << " errors detected\nTest " << (err_count==0 ? "passed\n" : "failed\n"); return err_count; } // main