| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | 
							- /*
 
-  *  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 {
 
- #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
 
-                 return "";
 
- #else
 
-                 try {
 
-                     if( it == itEnd )
 
-                         std::rethrow_exception(std::current_exception());
 
-                     else
 
-                         return (*it)->translate( it+1, itEnd );
 
-                 }
 
-                 catch( T& ex ) {
 
-                     return m_translateFunction( ex );
 
-                 }
 
- #endif
 
-             }
 
-         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 ); \
 
-     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 )
 
- #endif // TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED
 
 
  |