forked from catchorg/Catch2
		
	
		
			
				
	
	
		
			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
 |