mirror of
https://github.com/boostorg/lexical_cast.git
synced 2025-05-09 14:57:47 +00:00
92 lines
2.6 KiB
C++
92 lines
2.6 KiB
C++
// 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 <limits> 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 <iostream>
|
|
#include <climits>
|
|
#include <cfloat> // for DBL_MAX (Peter Schmid)
|
|
#include <boost/cast.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;
|
|
|
|
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<Derived*>( base ); // downcast
|
|
assert( derived->kind() == 'D' );
|
|
|
|
derived = 0;
|
|
derived = polymorphic_cast<Derived*>( base ); // downcast, throw on error
|
|
assert( derived->kind() == 'D' );
|
|
|
|
base2 = polymorphic_cast<Base2*>( 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<Derived*>( base ); } // #1 assert failure
|
|
|
|
bool caught_exception = false;
|
|
try { derived = polymorphic_cast<Derived*>( 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
|