]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // boost utility cast test program -----------------------------------------// |
2 | ||
3 | // (C) Copyright Beman Dawes, Dave Abrahams 1999. Distributed under the Boost | |
4 | // Software License, Version 1.0. (See accompanying file | |
5 | // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
6 | ||
7 | // See http://www.boost.org for most recent version including documentation. | |
8 | ||
9 | // Revision History | |
10 | // 28 Set 04 factored out numeric_cast<> test (Fernando Cacciola) | |
11 | // 20 Jan 01 removed use of <limits> for portability to raw GCC (David Abrahams) | |
12 | // 28 Jun 00 implicit_cast removed (Beman Dawes) | |
13 | // 30 Aug 99 value_cast replaced by numeric_cast | |
14 | // 3 Aug 99 Initial Version | |
15 | ||
16 | #include <iostream> | |
17 | #include <boost/polymorphic_cast.hpp> | |
18 | #include <boost/core/lightweight_test.hpp> | |
19 | ||
20 | using namespace boost; | |
21 | using std::cout; | |
22 | ||
23 | namespace | |
24 | { | |
25 | struct Base | |
26 | { | |
27 | virtual char kind() { return 'B'; } | |
28 | }; | |
29 | ||
30 | struct Base2 | |
31 | { | |
32 | virtual char kind2() { return '2'; } | |
33 | }; | |
34 | ||
35 | struct Derived : public Base, Base2 | |
36 | { | |
37 | virtual char kind() { return 'D'; } | |
38 | }; | |
39 | } | |
40 | ||
41 | ||
42 | int main( int argc, char * argv[] ) | |
43 | { | |
44 | # ifdef NDEBUG | |
45 | cout << "NDEBUG is defined\n"; | |
46 | # else | |
47 | cout << "NDEBUG is not defined\n"; | |
48 | # endif | |
49 | ||
50 | cout << "\nBeginning tests...\n"; | |
51 | ||
52 | // test polymorphic_cast ---------------------------------------------------// | |
53 | ||
54 | // tests which should succeed | |
55 | Derived derived_instance; | |
56 | Base * base = &derived_instance; | |
57 | Derived * derived = polymorphic_downcast<Derived*>( base ); // downcast | |
58 | BOOST_TEST( derived->kind() == 'D' ); | |
59 | ||
60 | derived = polymorphic_cast<Derived*>( base ); // downcast, throw on error | |
61 | BOOST_TEST( derived->kind() == 'D' ); | |
62 | ||
63 | Base2 * base2 = polymorphic_cast<Base2*>( base ); // crosscast | |
64 | BOOST_TEST( base2->kind2() == '2' ); | |
65 | ||
66 | // tests which should result in errors being detected | |
67 | Base base_instance; | |
68 | base = &base_instance; | |
69 | ||
70 | if ( argc > 1 && *argv[1] == '1' ) | |
71 | { derived = polymorphic_downcast<Derived*>( base ); } // #1 assert failure | |
72 | ||
73 | bool caught_exception = false; | |
74 | try { derived = polymorphic_cast<Derived*>( base ); } | |
92f5a8d4 | 75 | catch (const std::bad_cast&) |
7c673cae FG |
76 | { cout<<"caught bad_cast\n"; caught_exception = true; } |
77 | BOOST_TEST( caught_exception ); | |
78 | // the following is just so generated code can be inspected | |
79 | BOOST_TEST( derived->kind() != 'B' ); | |
80 | ||
81 | return boost::report_errors(); | |
82 | } // main |