blob: 8294a861547a802e3c1821ec22093b795a2fd5f8 [file] [log] [blame]
/*
* Created by Phil on 29/10/2010.
* Copyright 2010 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_COMMON_H_INCLUDED
#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED
#include "catch_compiler_capabilities.h"
#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
#ifdef CATCH_CONFIG_COUNTER
# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )
#else
# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
#endif
#include <iosfwd>
#include <string>
#include <cstdint>
namespace Catch {
struct CaseSensitive { enum Choice {
Yes,
No
}; };
class NonCopyable {
NonCopyable( NonCopyable const& ) = delete;
NonCopyable( NonCopyable && ) = delete;
NonCopyable& operator = ( NonCopyable const& ) = delete;
NonCopyable& operator = ( NonCopyable && ) = delete;
protected:
NonCopyable();
virtual ~NonCopyable();
};
struct SourceLineInfo {
SourceLineInfo() = delete;
SourceLineInfo( char const* _file, std::size_t _line ) noexcept
: file( _file ),
line( _line )
{}
SourceLineInfo( SourceLineInfo const& other ) = default;
SourceLineInfo( SourceLineInfo && ) = default;
SourceLineInfo& operator = ( SourceLineInfo const& ) = default;
SourceLineInfo& operator = ( SourceLineInfo && ) = default;
bool empty() const noexcept;
bool operator == ( SourceLineInfo const& other ) const noexcept;
bool operator < ( SourceLineInfo const& other ) const noexcept;
char const* file;
std::size_t line;
};
std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );
// Use this in variadic streaming macros to allow
// >> +StreamEndStop
// as well as
// >> stuff +StreamEndStop
struct StreamEndStop {
std::string operator+() const;
};
template<typename T>
T const& operator + ( T const& value, StreamEndStop ) {
return value;
}
// A replacement for the "throw" keyword which is illegal when
// exceptions are disabled with -fno-exceptions.
struct Exception {
template <typename E>
[[noreturn]] static void doThrow(E&& e) {
#if CATCH_CONFIG_USE_EXCEPTIONS
throw std::forward<E>(e);
#else
// "throw" keyword is unsupported when exceptions are disabled.
// Immediately terminate instead.
(void)e; // error: unused parameter 'e' [-Werror,-Wunused-parameter]
std::terminate();
#endif
}
};
}
#define CATCH_INTERNAL_LINEINFO \
::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )
#if CATCH_CONFIG_USE_EXCEPTIONS
# define CATCH_INTERNAL_TRY try
# define CATCH_INTERNAL_CATCH( type, var) catch( type var )
# define CATCH_INTERNAL_CATCH_UNNAMED( type ) catch( type )
# define CATCH_INTERNAL_CATCH_ALL() catch( ... )
#else
// 'try' and 'catch' (and 'throw') keywords are illegal with -fno-exceptions.
# define CATCH_INTERNAL_TRY if ((true))
# define CATCH_INTERNAL_CATCH( typ, var ) while ((false)) for ( typename std::remove_reference<typ>::type var ; ; )
# define CATCH_INTERNAL_CATCH_UNNAMED( type ) while ((false))
# define CATCH_INTERNAL_CATCH_ALL() while ((false))
#endif
#endif // TWOBLUECUBES_CATCH_COMMON_H_INCLUDED