Chris@16: // (C) Copyright Gennadiy Rozental 2005-2008. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : Facilities to perform exception safety tests Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_TEST_EXCEPTION_SAFETY_HPP_111705GER Chris@16: #define BOOST_TEST_EXCEPTION_SAFETY_HPP_111705GER Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: // STL Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_TEST_EXCEPTION_SAFETY ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_TEST_EXCEPTION_SAFETY( test_name ) \ Chris@16: struct test_name : public BOOST_AUTO_TEST_CASE_FIXTURE \ Chris@16: { void test_method(); }; \ Chris@16: \ Chris@16: static void BOOST_AUTO_TC_INVOKER( test_name )() \ Chris@16: { \ Chris@16: test_name t; \ Chris@16: ::boost::itest::exception_safety( \ Chris@16: boost::bind( &test_name::test_method, t ), \ Chris@16: BOOST_STRINGIZE(test_name) ); \ Chris@16: } \ Chris@16: \ Chris@16: struct BOOST_AUTO_TC_UNIQUE_ID( test_name ) {}; \ Chris@16: \ Chris@16: BOOST_AUTO_TU_REGISTRAR( test_name )( \ Chris@16: boost::unit_test::make_test_case( \ Chris@16: &BOOST_AUTO_TC_INVOKER( test_name ), #test_name ), \ Chris@16: boost::unit_test::ut_detail::auto_tc_exp_fail< \ Chris@16: BOOST_AUTO_TC_UNIQUE_ID( test_name )>::instance()->value() ); \ Chris@16: \ Chris@16: void test_name::test_method() \ Chris@16: /**/ Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace itest { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** exception safety test ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: void BOOST_TEST_DECL exception_safety( unit_test::callback0<> const& F, Chris@16: unit_test::const_string test_name = "" ); Chris@16: Chris@16: } // namespace itest Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** global operator new/delete overloads ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #ifndef BOOST_ITEST_NO_NEW_OVERLOADS Chris@16: Chris@16: #include Chris@16: Chris@16: # ifdef BOOST_NO_STDC_NAMESPACE Chris@16: namespace std { using ::isprint; using ::malloc; using ::free; } Chris@16: # endif Chris@16: Chris@16: inline void* Chris@16: operator new( std::size_t s ) throw(std::bad_alloc) Chris@16: { Chris@16: void* res = std::malloc(s ? s : 1); Chris@16: Chris@16: if( res ) Chris@16: ::boost::itest::manager::instance().allocated( 0, 0, res, s ); Chris@16: else Chris@16: throw std::bad_alloc(); Chris@16: Chris@16: return res; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: inline void* Chris@16: operator new( std::size_t s, std::nothrow_t const& ) throw() Chris@16: { Chris@16: void* res = std::malloc(s ? s : 1); Chris@16: Chris@16: if( res ) Chris@16: ::boost::itest::manager::instance().allocated( 0, 0, res, s ); Chris@16: Chris@16: return res; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: inline void* Chris@16: operator new[]( std::size_t s ) throw(std::bad_alloc) Chris@16: { Chris@16: void* res = std::malloc(s ? s : 1); Chris@16: Chris@16: if( res ) Chris@16: ::boost::itest::manager::instance().allocated( 0, 0, res, s ); Chris@16: else Chris@16: throw std::bad_alloc(); Chris@16: Chris@16: return res; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: inline void* Chris@16: operator new[]( std::size_t s, std::nothrow_t const& ) throw() Chris@16: { Chris@16: void* res = std::malloc(s ? s : 1); Chris@16: Chris@16: if( res ) Chris@16: ::boost::itest::manager::instance().allocated( 0, 0, res, s ); Chris@16: Chris@16: return res; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: inline void Chris@16: operator delete( void* p ) throw() Chris@16: { Chris@16: ::boost::itest::manager::instance().freed( p ); Chris@16: Chris@16: std::free( p ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: inline void Chris@16: operator delete( void* p, std::nothrow_t const& ) throw() Chris@16: { Chris@16: ::boost::itest::manager::instance().freed( p ); Chris@16: Chris@16: std::free( p ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: inline void Chris@16: operator delete[]( void* p ) throw() Chris@16: { Chris@16: ::boost::itest::manager::instance().freed( p ); Chris@16: Chris@16: std::free( p ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: inline void Chris@16: operator delete[]( void* p, std::nothrow_t const& ) throw() Chris@16: { Chris@16: ::boost::itest::manager::instance().freed( p ); Chris@16: Chris@16: std::free( p ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #endif // BOOST_ITEST_NO_NEW_OVERLOADS Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_TEST_EXCEPTION_SAFETY_HPP_111705GER