mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  *  catch_exception_interfaces.h
 | |
|  *  Catch
 | |
|  *
 | |
|  *  Created by Phil on 20/04/2011.
 | |
|  *  Copyright 2011 Two Blue Cubes Ltd. All rights reserved.
 | |
|  *
 | |
|  *  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)
 | |
|  *
 | |
|  */
 | |
| #ifndef TWOBLUECUBES_CATCH_INTERFACES_EXCEPTIONS_H_INCLUDED
 | |
| #define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTIONS_H_INCLUDED
 | |
| 
 | |
| #include <string>
 | |
|                                               
 | |
| namespace Catch
 | |
| {    
 | |
|     typedef std::string(*exceptionTranslateFunction)();
 | |
| 
 | |
|     struct IExceptionTranslator
 | |
|     {
 | |
|         virtual ~IExceptionTranslator(){}
 | |
|         virtual std::string translate() const = 0;
 | |
|     };
 | |
|     
 | |
|     struct IExceptionTranslatorRegistry
 | |
|     {
 | |
|         virtual ~IExceptionTranslatorRegistry
 | |
|         ()
 | |
|         {}
 | |
|         
 | |
|         virtual void registerTranslator
 | |
|             (   IExceptionTranslator* translator 
 | |
|             ) = 0;
 | |
|         virtual std::string translateActiveException
 | |
|             () const = 0;
 | |
|         
 | |
|     };
 | |
| 
 | |
|     class ExceptionTranslatorRegistrar
 | |
|     {
 | |
|         template<typename T>
 | |
|         class ExceptionTranslator : public IExceptionTranslator
 | |
|         {
 | |
|         public:
 | |
|             
 | |
|             ExceptionTranslator
 | |
|             (
 | |
|                 std::string(*translateFunction)( T& ) 
 | |
|             )
 | |
|             : m_translateFunction( translateFunction )
 | |
|             {}
 | |
|             
 | |
|             virtual std::string translate
 | |
|             ()
 | |
|             const
 | |
|             {
 | |
|                 try
 | |
|                 {
 | |
|                     throw;
 | |
|                 }
 | |
|                 catch( T& ex )
 | |
|                 {
 | |
|                     return m_translateFunction( ex );
 | |
|                 }
 | |
|             }
 | |
|             
 | |
|         protected:
 | |
|             std::string(*m_translateFunction)( T& );
 | |
|         };
 | |
|         
 | |
|     public:
 | |
|         template<typename T>
 | |
|         ExceptionTranslatorRegistrar
 | |
|         (
 | |
|             std::string(*translateFunction)( T& ) 
 | |
|         )
 | |
|         {
 | |
|             Catch::Hub::getExceptionTranslatorRegistry().registerTranslator
 | |
|                 ( new ExceptionTranslator<T>( translateFunction ) );
 | |
|         }
 | |
|     };
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| #define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \
 | |
|     static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \
 | |
|     namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\
 | |
|     static std::string INTERNAL_CATCH_UNIQUE_NAME(  catch_internal_ExceptionTranslator )( signature )
 | |
| 
 | |
| #endif // TWOBLUECUBES_CATCH_INTERFACES_EXCEPTIONS_H_INCLUDED
 | 
