catch2/include/internal/catch_interfaces_exception.h
Phil Nash 5ec53b2788 renamed hub -> context
(also did some reformatting)
2012-05-10 07:58:48 +01:00

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::Context::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