mirror of https://github.com/procxx/kepka.git
				
				
				
			
		
			
				
	
	
		
			82 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			3.0 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 "catch_interfaces_registry_hub.h"
 | |
| 
 | |
| #if defined(CATCH_CONFIG_DISABLE)
 | |
|     #define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \
 | |
|         static std::string translatorName( signature )
 | |
| #endif
 | |
| 
 | |
| #include <exception>
 | |
| #include <string>
 | |
| #include <vector>
 | |
| 
 | |
| namespace Catch {
 | |
|     using exceptionTranslateFunction = std::string(*)();
 | |
| 
 | |
|     struct IExceptionTranslator;
 | |
|     using ExceptionTranslators = std::vector<std::unique_ptr<IExceptionTranslator const>>;
 | |
| 
 | |
|     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 )
 | |
|             {}
 | |
| 
 | |
|             std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override {
 | |
|                 try {
 | |
|                     if( it == itEnd )
 | |
|                         std::rethrow_exception(std::current_exception());
 | |
|                     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
 |