catch2/include/internal/catch_interfaces_exception.h

89 lines
3.2 KiB
C
Raw Normal View History

2011-04-20 16:40:40 +02:00
/*
* 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
2011-04-20 16:40:40 +02:00
#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>
2011-04-20 16:40:40 +02:00
#include <string>
#include <vector>
2012-05-15 09:02:36 +02:00
namespace Catch {
2017-07-27 12:24:21 +02:00
using exceptionTranslateFunction = std::string(*)();
2011-04-20 16:40:40 +02:00
struct IExceptionTranslator;
2017-07-27 12:24:21 +02:00
using ExceptionTranslators = std::vector<std::unique_ptr<IExceptionTranslator const>>;
2015-12-04 11:20:33 +01:00
2012-05-15 09:02:36 +02:00
struct IExceptionTranslator {
virtual ~IExceptionTranslator();
virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0;
2011-04-20 16:40:40 +02:00
};
2012-05-15 09:02:36 +02:00
struct IExceptionTranslatorRegistry {
virtual ~IExceptionTranslatorRegistry();
2012-05-15 09:02:36 +02:00
virtual std::string translateActiveException() const = 0;
2011-04-20 16:40:40 +02:00
};
2012-05-15 09:02:36 +02:00
class ExceptionTranslatorRegistrar {
2011-04-20 20:09:41 +02:00
template<typename T>
2012-05-15 09:02:36 +02:00
class ExceptionTranslator : public IExceptionTranslator {
2011-04-20 20:09:41 +02:00
public:
2012-05-15 09:02:36 +02:00
ExceptionTranslator( std::string(*translateFunction)( T& ) )
2011-04-20 20:09:41 +02:00
: m_translateFunction( translateFunction )
{}
std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override {
#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
return "";
#else
2012-05-15 09:02:36 +02:00
try {
if( it == itEnd )
std::rethrow_exception(std::current_exception());
else
return (*it)->translate( it+1, itEnd );
2011-04-20 20:09:41 +02:00
}
2012-05-15 09:02:36 +02:00
catch( T& ex ) {
2011-04-20 20:09:41 +02:00
return m_translateFunction( ex );
}
#endif
2011-04-20 16:40:40 +02:00
}
2011-04-20 20:09:41 +02:00
protected:
std::string(*m_translateFunction)( T& );
};
2011-04-20 20:09:41 +02:00
public:
template<typename T>
2012-05-15 09:02:36 +02:00
ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {
getMutableRegistryHub().registerTranslator
2011-04-20 20:09:41 +02:00
( new ExceptionTranslator<T>( translateFunction ) );
}
2011-04-20 16:40:40 +02:00
};
}
2011-04-20 20:09:41 +02:00
///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \
static std::string translatorName( signature ); \
CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
static std::string translatorName( signature )
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )
2011-04-20 20:09:41 +02:00
#endif // TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED