mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-30 06:31:50 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  *  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_EXCEPTION_H_INCLUDED
 | |
| #define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED
 | |
| 
 | |
| #include <string>
 | |
| #include <vector>
 | |
| 
 | |
| #include "catch_interfaces_registry_hub.h"
 | |
| 
 | |
| namespace Catch {
 | |
| 
 | |
|     typedef std::string(*exceptionTranslateFunction)();
 | |
| 
 | |
|     struct IExceptionTranslator;
 | |
|     typedef std::vector<const IExceptionTranslator*> ExceptionTranslators;
 | |
| 
 | |
|     struct IExceptionTranslator {
 | |
|         virtual ~IExceptionTranslator();
 | |
|         virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0;
 | |
|     };
 | |
| 
 | |
|     struct IExceptionTranslatorRegistry {
 | |
|         virtual ~IExceptionTranslatorRegistry();
 | |
| 
 | |
|         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( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE {
 | |
|                 try {
 | |
|                     if( it == itEnd )
 | |
|                         throw;
 | |
|                     else
 | |
|                         return (*it)->translate( it+1, itEnd );
 | |
|                 }
 | |
|                 catch( T& ex ) {
 | |
|                     return m_translateFunction( ex );
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|         protected:
 | |
|             std::string(*m_translateFunction)( T& );
 | |
|         };
 | |
| 
 | |
|     public:
 | |
|         template<typename T>
 | |
|         ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {
 | |
|             getMutableRegistryHub().registerTranslator
 | |
|                 ( new ExceptionTranslator<T>( translateFunction ) );
 | |
|         }
 | |
|     };
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| #define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \
 | |
|     static std::string translatorName( signature ); \
 | |
|     namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\
 | |
|     static std::string translatorName( signature )
 | |
| 
 | |
| #define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )
 | |
| 
 | |
| #endif // TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED
 |