cloning_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 472 行
CPP
472 行
//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.//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 <boost/exception_ptr.hpp>#include <boost/exception/get_error_info.hpp>#include <boost/exception/info.hpp>#include <boost/detail/lightweight_test.hpp>#include <boost/detail/workaround.hpp>#include <string>#if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x610))struct my_tag {};#endiftypedef boost::error_info<struct my_tag,int> my_info;template <class T>structmay_throw_on_copy { may_throw_on_copy(): throw_(false) { } may_throw_on_copy( may_throw_on_copy const & x ): throw_(x.throw_) { if( throw_ ) throw T(); } bool throw_; };structderives_nothing { int & count; explicit derives_nothing( int & c ): count(c) { ++count; } derives_nothing( derives_nothing const & x ): count(x.count) { ++count; } ~derives_nothing() { --count; } };structderives_std_exception: std::exception { };structderives_std_boost_exception: std::exception, boost::exception { };structderives_boost_exception: boost::exception { };template <class T>voidtest_std_exception() { try { throw T(); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( T & ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( T & ) { } catch( ... ) { BOOST_TEST(false); } } catch( ... ) { BOOST_TEST(false); } } }template <class T>voidtest_std_exception_what() { try { throw T("what"); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( T & x ) { BOOST_TEST(std::string("what")==x.what()); boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( T & x ) { BOOST_TEST(std::string("what")==x.what()); } catch( ... ) { BOOST_TEST(false); } } catch( ... ) { BOOST_TEST(false); } } }template <class Throw,class Catch>voidtest_throw_on_copy() { try { try { throw boost::enable_current_exception(may_throw_on_copy<Throw>()); } catch( may_throw_on_copy<Throw> & x ) { x.throw_=true; throw; } catch( ... ) { BOOST_TEST(false); } } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( Catch & ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { boost::rethrow_exception(p); BOOST_TEST(false); } catch( Catch & ) { } catch( ... ) { BOOST_TEST(false); } } catch( ... ) { BOOST_TEST(false); } } }intmain() { BOOST_TEST( boost::exception_ptr()==boost::exception_ptr() ); BOOST_TEST( !(boost::exception_ptr()!=boost::exception_ptr()) ); BOOST_TEST( !boost::exception_ptr() ); int count=0; try { throw boost::enable_current_exception(derives_nothing(count)); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( derives_nothing & ) { } catch( ... ) { BOOST_TEST(false); } } BOOST_TEST(count==0); try { throw boost::enable_current_exception(derives_std_exception()); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( derives_std_exception & ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( derives_std_exception & ) { } catch( ... ) { BOOST_TEST(false); } } catch( ... ) { BOOST_TEST(false); } } try { throw derives_std_exception(); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( boost::unknown_exception & ) { } catch( ... ) { BOOST_TEST(false); } } test_std_exception_what<std::invalid_argument>(); test_std_exception_what<std::out_of_range>(); test_std_exception_what<std::logic_error>(); test_std_exception<std::bad_alloc>();#ifndef BOOST_NO_TYPEID test_std_exception<std::bad_cast>(); test_std_exception<std::bad_typeid>();#endif test_std_exception<std::bad_exception>(); try { throw derives_std_boost_exception() << my_info(42); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( boost::unknown_exception & x ) { BOOST_TEST(boost::get_error_info<my_info>(x)); if( boost::shared_ptr<int const> p=boost::get_error_info<my_info>(x) ) BOOST_TEST(*p==42); boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( boost::unknown_exception & x ) { BOOST_TEST(boost::get_error_info<my_info>(x)); if( boost::shared_ptr<int const> p=boost::get_error_info<my_info>(x) ) BOOST_TEST(*p==42); } catch( ... ) { BOOST_TEST(false); } } catch( ... ) { BOOST_TEST(false); } } try { throw derives_boost_exception() << my_info(42); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( boost::unknown_exception & x ) { BOOST_TEST(boost::get_error_info<my_info>(x)); if( boost::shared_ptr<int const> p=boost::get_error_info<my_info>(x) ) BOOST_TEST(*p==42); boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( boost::unknown_exception & x ) { BOOST_TEST(boost::get_error_info<my_info>(x)); if( boost::shared_ptr<int const> p=boost::get_error_info<my_info>(x) ) BOOST_TEST(*p==42); } catch( ... ) { BOOST_TEST(false); } } catch( ... ) { BOOST_TEST(false); } } test_throw_on_copy<std::bad_alloc,std::bad_alloc>(); test_throw_on_copy<int,std::bad_exception>(); return boost::report_errors(); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?