|
Teuchos Package Browser (Single Doxygen Collection)
Version of the Day
|
00001 // @HEADER 00002 // *********************************************************************** 00003 // 00004 // Teuchos: Common Tools Package 00005 // Copyright (2004) Sandia Corporation 00006 // 00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 00008 // license for use of this work by or on behalf of the U.S. Government. 00009 // 00010 // Redistribution and use in source and binary forms, with or without 00011 // modification, are permitted provided that the following conditions are 00012 // met: 00013 // 00014 // 1. Redistributions of source code must retain the above copyright 00015 // notice, this list of conditions and the following disclaimer. 00016 // 00017 // 2. Redistributions in binary form must reproduce the above copyright 00018 // notice, this list of conditions and the following disclaimer in the 00019 // documentation and/or other materials provided with the distribution. 00020 // 00021 // 3. Neither the name of the Corporation nor the names of the 00022 // contributors may be used to endorse or promote products derived from 00023 // this software without specific prior written permission. 00024 // 00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00036 // 00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 00038 // 00039 // *********************************************************************** 00040 // @HEADER 00041 00042 #include "Teuchos_dyn_cast.hpp" 00043 #include "Teuchos_CommandLineProcessor.hpp" 00044 #include "Teuchos_GlobalMPISession.hpp" 00045 #include "Teuchos_Version.hpp" 00046 00047 class A { public: virtual ~A(){} }; 00048 class B : public A { public: void f(bool verbose) { if(verbose) std::cout << "\nB::f() called!\n"; } }; 00049 class C : public A {}; 00050 00051 int main( int argc, char* argv[] ) 00052 { 00053 00054 using Teuchos::CommandLineProcessor; 00055 00056 bool verbose = true; 00057 00058 Teuchos::GlobalMPISession mpiSession(&argc, &argv); 00059 00060 try { 00061 00062 // Read options from the commandline 00063 CommandLineProcessor clp(false); // Don't throw exceptions 00064 clp.setOption( "verbose", "quiet", &verbose, "Set if output is printed or not." ); 00065 CommandLineProcessor::EParseCommandLineReturn parse_return = clp.parse(argc,argv); 00066 if( parse_return != CommandLineProcessor::PARSE_SUCCESSFUL ) return parse_return; 00067 00068 if(verbose) std::cout << Teuchos::Teuchos_Version() << std::endl << std::endl; 00069 00070 if(verbose) std::cout 00071 << "\n*******************************************" 00072 << "\n*** Basic test of Teuchos::dyn_cast<>() ***" 00073 << "\n*******************************************\n"; 00074 B b; 00075 A &a = b; 00076 try { 00077 if(verbose) std::cout << "\nTrying: dynamic_cast<C&>(a); [Should throw a std::bad_cast std::exception with very bad error message]\n"; 00078 C& c_from_an_a = dynamic_cast<C&>(a); 00079 (void) c_from_an_a; // forestall "unused variable" compiler warnings 00080 } 00081 catch( const std::bad_cast &e ) { 00082 if(verbose) std::cout << "\nCaught std::bad_cast std::exception e where e.what() = \"" << e.what() << "\"\n"; 00083 } 00084 try { 00085 if(verbose) std::cout << "\nTrying: Teuchos::dyn_cast<C>(a); [Should throw a std::bad_cast std::exception with a very good error message]\n"; 00086 Teuchos::dyn_cast<C>(a); 00087 } 00088 catch( const std::bad_cast &e ) { 00089 if(verbose) std::cout << "\nCaught std::bad_cast std::exception e where e.what() = \"" << e.what() << "\"\n"; 00090 } 00091 if(verbose) std::cout << "\nTrying: Teuchos::dyn_cast<B>(a).f(); [Should succeed and print \"B::f() called\"]\n"; 00092 Teuchos::dyn_cast<B>(a).f(verbose); 00093 if(verbose) std::cout << "\nAll tests check out!\n"; 00094 } 00095 catch( const std::exception &excpt ) { 00096 if(verbose) 00097 std::cerr << "*** Caught standard std::exception : " << excpt.what() << std::endl; 00098 return 1; 00099 } 00100 catch( ... ) { 00101 if(verbose) 00102 std::cerr << "*** Caught an unknown std::exception\n"; 00103 return 1; 00104 } 00105 return 0; 00106 }
1.7.6.1