//====================================================================================================================== // // This file is part of waLBerla. waLBerla is free software: you can // redistribute it and/or modify it under the terms of the GNU General Public // License as published by the Free Software Foundation, either version 3 of // the License, or (at your option) any later version. // // waLBerla is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License along // with waLBerla (see COPYING.txt). If not, see . // //! \file CheckFunctions.h //! \ingroup core //! \author Christian Godenschwager // //====================================================================================================================== #pragma once #include "PrintStacktrace.h" #include "core/DataTypes.h" #include "core/Macros.h" #include "core/math/MathTrait.h" #include "core/math/Utility.h" #include "core/VectorTrait.h" #include #include #include #include #include #include #include #include #include #include #include /*******************************************************************************************************************//** * Some check functions. The two parameter versions have the advantage of printing the values of their arguments in * case of error. * Note: The checks will be performed in Debug and in Release mode! Do not use as replacements of * assertions in regular code! For assertions, use assert macros! * * Available macros are: * --------------------- * - WALBERLA_CHECK( X ) - X must evaluate to true, otherwise the check fails * - WALBERLA_CHECK_NULLPTR( X ) - X must be a null pointer, otherwise the check fails * - WALBERLA_CHECK_NOT_NULLPTR( X ) - X must not be a null pointer, otherwise the check fails * - WALBERLA_CHECK_EQUAL( X, Y ) - X must be equal to Y, otherwise the check fails * (for floating point types, use FLOAT_EQUAL or IDENTICAL) * - WALBERLA_CHECK_UNEQUAL( X, Y ) - X must not be equal to Y, otherwise the check fails * (for floating point types, use FLOAT_UNEQUAL or NOT_IDENTICAL) * - WALBERLA_CHECK_FLOAT_EQUAL( X, Y ) - X must be equal to Y, otherwise the check fails * (floating point types are considered equal even if they differ by a small epsilon) * - WALBERLA_CHECK_FLOAT_UNEQUAL( X, Y ) - X must not be equal to Y, otherwise the check fails * (floating point types are only considered unequal if they differ by more than a small epsilon) * - WALBERLA_CHECK_IDENTICAL( X, Y ) - X must be identical to Y, otherwise the check fails * (floating point types are only identical if they are bit-identical) * - WALBERLA_CHECK_NOT_IDENTICAL( X, Y ) - X must not be identical to Y, otherwise the check fails * (floating point types are not identical if they are not bit-identical) * - WALBERLA_CHECK_LESS( X, Y ) - check fails if XY evaluates to false * - WALBERLA_CHECK_LESS_EQUAL( X, Y ) - check fails if X<=Y evaluates to false * - WALBERLA_CHECK_GREATER_EQUAL( X, Y ) - check fails if X>=Y evaluates to false * * For every macro, you can provide a custom message via an additional argument, e.g.: * WALBERLA_CHECK( false, "Will always fail!" ) * or * WALBERLA_CHECK_LESS( 42, 5, "42 is larger than 5!" ) * **********************************************************************************************************************/ #define WALBERLA_CHECK_1(X) { if( !walberla::debug::check_functions_detail::check ( (X) ) ) { walberla::debug::check_functions_detail::check ( #X, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_NULLPTR_1(X) { if( !walberla::debug::check_functions_detail::check_nullptr ( (X) ) ) { walberla::debug::check_functions_detail::check_nullptr ( (X), #X, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_NOT_NULLPTR_1(X) { if( !walberla::debug::check_functions_detail::check_not_nullptr ( (X) ) ) { walberla::debug::check_functions_detail::check_not_nullptr ( #X, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_EQUAL_2(X,Y) { if( !walberla::debug::check_functions_detail::check_equal ( (X), (Y) ) ) { walberla::debug::check_functions_detail::check_equal ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_UNEQUAL_2(X,Y) { if( !walberla::debug::check_functions_detail::check_unequal ( (X), (Y) ) ) { walberla::debug::check_functions_detail::check_unequal ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_FLOAT_EQUAL_2(X,Y) { if( !walberla::debug::check_functions_detail::check_float_equal ( (X), (Y) ) ) { walberla::debug::check_functions_detail::check_float_equal ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_FLOAT_UNEQUAL_2(X,Y) { if( !walberla::debug::check_functions_detail::check_float_unequal( (X), (Y) ) ) { walberla::debug::check_functions_detail::check_float_unequal( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_FLOAT_EQUAL_EPSILON_3(X,Y,EPS) { if( !walberla::debug::check_functions_detail::check_float_equal_eps ( (X), (Y), (EPS) ) ) { walberla::debug::check_functions_detail::check_float_equal_eps ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler(), (EPS) ); } } #define WALBERLA_CHECK_FLOAT_UNEQUAL_EPSILON_3(X,Y,EPS) { if( !walberla::debug::check_functions_detail::check_float_unequal_eps( (X), (Y), (EPS) ) ) { walberla::debug::check_functions_detail::check_float_unequal_eps( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler(), (EPS) ); } } #define WALBERLA_CHECK_IDENTICAL_2(X,Y) { if( !walberla::debug::check_functions_detail::check_identical ( (X), (Y) ) ) { walberla::debug::check_functions_detail::check_identical ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_NOT_IDENTICAL_2(X,Y) { if( !walberla::debug::check_functions_detail::check_not_identical( (X), (Y) ) ) { walberla::debug::check_functions_detail::check_not_identical( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_LESS_2(X,Y) { if( !walberla::debug::check_functions_detail::check_less ( (X), (Y) ) ) { walberla::debug::check_functions_detail::check_less ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_GREATER_2(X,Y) { if( !walberla::debug::check_functions_detail::check_greater ( (X), (Y) ) ) { walberla::debug::check_functions_detail::check_greater ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_LESS_EQUAL_2(X,Y) { if( !walberla::debug::check_functions_detail::check_less_equal ( (X), (Y) ) ) { walberla::debug::check_functions_detail::check_less_equal ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_GREATER_EQUAL_2(X,Y) { if( !walberla::debug::check_functions_detail::check_greater_equal( (X), (Y) ) ) { walberla::debug::check_functions_detail::check_greater_equal( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler() ); } } #define WALBERLA_CHECK_2(X,MSG) { if( !walberla::debug::check_functions_detail::check ( (X) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check ( #X, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_NULLPTR_2(X,MSG) { if( !walberla::debug::check_functions_detail::check_nullptr ( (X) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_nullptr ( (X), #X, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_NOT_NULLPTR_2(X,MSG) { if( !walberla::debug::check_functions_detail::check_not_nullptr ( (X) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_not_nullptr ( #X, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_EQUAL_3(X,Y,MSG) { if( !walberla::debug::check_functions_detail::check_equal ( (X), (Y) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_equal ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_UNEQUAL_3(X,Y,MSG) { if( !walberla::debug::check_functions_detail::check_unequal ( (X), (Y) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_unequal ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_FLOAT_EQUAL_3(X,Y,MSG) { if( !walberla::debug::check_functions_detail::check_float_equal ( (X), (Y) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_float_equal ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_FLOAT_UNEQUAL_3(X,Y,MSG) { if( !walberla::debug::check_functions_detail::check_float_unequal( (X), (Y) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_float_unequal( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_FLOAT_EQUAL_EPSILON_4(X,Y,EPS,MSG) { if( !walberla::debug::check_functions_detail::check_float_equal_eps ( (X), (Y), (EPS) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_float_equal_eps ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ), (EPS) ); } } #define WALBERLA_CHECK_FLOAT_UNEQUAL_EPSILON_4(X,Y,EPS,MSG) { if( !walberla::debug::check_functions_detail::check_float_unequal_eps( (X), (Y), (EPS) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_float_unequal_eps( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ), (EPS) ); } } #define WALBERLA_CHECK_IDENTICAL_3(X,Y,MSG) { if( !walberla::debug::check_functions_detail::check_identical ( (X), (Y) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_identical ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_NOT_IDENTICAL_3(X,Y,MSG) { if( !walberla::debug::check_functions_detail::check_not_identical( (X), (Y) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_not_identical( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_LESS_3(X,Y,MSG) { if( !walberla::debug::check_functions_detail::check_less ( (X), (Y) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_less ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_GREATER_3(X,Y,MSG) { if( !walberla::debug::check_functions_detail::check_greater ( (X), (Y) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_greater ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_LESS_EQUAL_3(X,Y,MSG) { if( !walberla::debug::check_functions_detail::check_less_equal ( (X), (Y) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_less_equal ( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_GREATER_EQUAL_3(X,Y,MSG) { if( !walberla::debug::check_functions_detail::check_greater_equal( (X), (Y) ) ) { std::stringstream _ss_; _ss_ << MSG; walberla::debug::check_functions_detail::check_greater_equal( (X), (Y), #X, #Y, __FILE__, __LINE__, walberla::debug::check_functions_detail::ExitHandler( _ss_.str() ) ); } } #define WALBERLA_CHECK_3(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NULLPTR_3(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NULLPTR_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NULLPTR_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NULLPTR_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NOT_NULLPTR_3(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NOT_NULLPTR_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NOT_NULLPTR_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NOT_NULLPTR_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_EQUAL_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_EQUAL_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_EQUAL_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_EQUAL_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_UNEQUAL_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_UNEQUAL_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_UNEQUAL_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_UNEQUAL_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_EQUAL_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_EQUAL_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_EQUAL_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_EQUAL_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_UNEQUAL_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_UNEQUAL_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_UNEQUAL_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_UNEQUAL_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_EQUAL_EPSILON_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_EQUAL_EPSILON_2(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_EQUAL_EPSILON_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_EQUAL_EPSILON_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_UNEQUAL_EPSILON_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_UNEQUAL_EPSILON_2(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_UNEQUAL_EPSILON_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_FLOAT_UNEQUAL_EPSILON_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_IDENTICAL_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_IDENTICAL_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_IDENTICAL_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_IDENTICAL_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NOT_IDENTICAL_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NOT_IDENTICAL_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NOT_IDENTICAL_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_NOT_IDENTICAL_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_LESS_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_LESS_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_LESS_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_LESS_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_GREATER_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_GREATER_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_GREATER_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_GREATER_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_LESS_EQUAL_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_LESS_EQUAL_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_LESS_EQUAL_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_LESS_EQUAL_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_GREATER_EQUAL_1(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_GREATER_EQUAL_4(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_GREATER_EQUAL_5(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK_GREATER_EQUAL_6(...) THIS_IS_SUPPOSED_TO_FAIL___YOU_MADE_AN_ERROR_WHEN_USING_A_CHECK_MACRO #define WALBERLA_CHECK(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_, __VA_ARGS__ ) #define WALBERLA_CHECK_NULLPTR(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_NULLPTR_, __VA_ARGS__ ) #define WALBERLA_CHECK_NOT_NULLPTR(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_NOT_NULLPTR_, __VA_ARGS__ ) #define WALBERLA_CHECK_EQUAL(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_EQUAL_, __VA_ARGS__ ) #define WALBERLA_CHECK_UNEQUAL(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_UNEQUAL_, __VA_ARGS__ ) #define WALBERLA_CHECK_FLOAT_EQUAL(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_FLOAT_EQUAL_, __VA_ARGS__ ) #define WALBERLA_CHECK_FLOAT_UNEQUAL(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_FLOAT_UNEQUAL_, __VA_ARGS__ ) #define WALBERLA_CHECK_FLOAT_EQUAL_EPSILON(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_FLOAT_EQUAL_EPSILON_, __VA_ARGS__ ) #define WALBERLA_CHECK_FLOAT_UNEQUAL_EPSILON(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_FLOAT_UNEQUAL_EPSILON_, __VA_ARGS__ ) #define WALBERLA_CHECK_IDENTICAL(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_IDENTICAL_, __VA_ARGS__ ) #define WALBERLA_CHECK_NOT_IDENTICAL(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_NOT_IDENTICAL_, __VA_ARGS__ ) #define WALBERLA_CHECK_LESS(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_LESS_, __VA_ARGS__ ) #define WALBERLA_CHECK_GREATER(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_GREATER_, __VA_ARGS__ ) #define WALBERLA_CHECK_LESS_EQUAL(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_LESS_EQUAL_, __VA_ARGS__ ) #define WALBERLA_CHECK_GREATER_EQUAL(...) WALBERLA_MACRO_OVERLOAD( WALBERLA_CHECK_GREATER_EQUAL_, __VA_ARGS__ ) /// \cond internal namespace walberla { namespace debug { namespace check_functions_detail { struct ExitHandler { ExitHandler() {}; ExitHandler( const std::string & message ) : message_( message ) {} void operator()( const std::string & checkErrorMessage ); private: std::string message_; }; inline bool check( bool b ) { return b; } template< typename T > inline bool check_nullptr( T * p ); template< typename T > inline bool check_nullptr( const shared_ptr & p ); template< typename T > inline bool check_not_nullptr( T * p ); template< typename T > inline bool check_not_nullptr( const shared_ptr & p ); template< typename T, typename U > inline bool check_equal( const T & lhs, const U & rhs ); template< typename T, typename U > inline bool check_equal( const T & lhs, const U & rhs, const boost::true_type & ); template< typename T, typename U > inline bool check_equal( const T & lhs, const U & rhs, const boost::false_type & ); template< typename T, typename U > inline bool check_unequal( const T & lhs, const U & rhs ); template< typename T, typename U > inline bool check_unequal( const T & lhs, const U & rhs, const boost::true_type & ); template< typename T, typename U > inline bool check_unequal( const T & lhs, const U & rhs, const boost::false_type & ); template< typename T, typename U > inline bool check_float_equal( const T & lhs, const U & rhs ); template< typename T, typename U > inline bool check_float_unequal( const T & lhs, const U & rhs ); template< typename T, typename U > inline bool check_float_equal_eps( const T & lhs, const U & rhs, const typename VectorTrait::LowType>::OutputType epsilon ); template< typename T, typename U > inline bool check_float_unequal_eps( const T & lhs, const U & rhs, const typename VectorTrait::LowType>::OutputType epsilon ); template< typename T, typename U > inline bool check_identical( const T & lhs, const U & rhs ); template< typename T, typename U > inline bool check_identical( const T & lhs, const U & rhs, const boost::true_type & ); template< typename T, typename U > inline bool check_identical( const T & lhs, const U & rhs, const boost::false_type & ); template< typename T, typename U > inline bool check_not_identical( const T & lhs, const U & rhs ); template< typename T, typename U > inline bool check_not_identical( const T & lhs, const U & rhs, const boost::true_type & ); template< typename T, typename U > inline bool check_not_identical( const T & lhs, const U & rhs, const boost::false_type & ); template< typename T, typename U > inline bool check_less( const T & lhs, const U & rhs ); template< typename T, typename U > inline bool check_less( const T & lhs, const U & rhs, const boost::true_type & ); template< typename T, typename U > inline bool check_less( const T & lhs, const U & rhs, const boost::false_type & ); template< typename T, typename U > inline bool check_greater( const T & lhs, const U & rhs ); template< typename T, typename U > inline bool check_greater( const T & lhs, const U & rhs, const boost::true_type & ); template< typename T, typename U > inline bool check_greater( const T & lhs, const U & rhs, const boost::false_type & ); template< typename T, typename U > inline bool check_less_equal( const T & lhs, const U & rhs ); template< typename T, typename U > inline bool check_less_equal( const T & lhs, const U & rhs, const boost::true_type & ); template< typename T, typename U > inline bool check_less_equal( const T & lhs, const U & rhs, const boost::false_type & ); template< typename T, typename U > inline bool check_greater_equal( const T & lhs, const U & rhs ); template< typename T, typename U > inline bool check_greater_equal( const T & lhs, const U & rhs, const boost::true_type & ); template< typename T, typename U > inline bool check_greater_equal( const T & lhs, const U & rhs, const boost::false_type & ); template< typename T > void check( const char * const expression, const char * const filename, int line, T failFunc ); template< typename T, typename U > void check_nullptr( T * p, const char * const ptrExpression, const char * const filename, int line, U failFunc ); template< typename T, typename U > void check_nullptr( const shared_ptr & p, const char * const ptrExpression, const char * const filename, int line, U failFunc ); template< typename T > void check_not_nullptr( const char * const ptrExpression, const char * const filename, int line, T failFunc ); template< typename T, typename U, typename V > void check_equal( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc); template< typename T, typename U, typename V > void check_unequal( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc ); template< typename T, typename U, typename V > void check_float_equal( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc ); template< typename T, typename U, typename V > void check_float_unequal( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc); template< typename T, typename U, typename V > void check_float_equal_eps( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc, const typename VectorTrait::LowType>::OutputType epsilon ); template< typename T, typename U, typename V > void check_float_unequal_eps( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc, const typename VectorTrait::LowType>::OutputType epsilon ); template< typename T, typename U, typename V > void check_identical( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc ); template< typename T, typename U, typename V > void check_not_identical( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc ); template< typename T, typename U, typename V > void check_less( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc ); template< typename T, typename U, typename V > void check_greater( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc ); template< typename T, typename U, typename V > void check_less_equal( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc ); template< typename T, typename U, typename V > void check_greater_equal( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const filename, int line, V failFunc ); template< typename T, typename U, typename V > void printErrorAndExit( const T & lhs, const U & rhs, const char * const lhsExpression, const char * const rhsExpression, const char * const opString, const char * const filename, int line, V failFunc ); template< typename T > std::ostream & printValue( std::ostream & os, const T & value ); template< typename T > std::ostream & printValue( std::ostream & os, const T & value, const boost::true_type & ); template< typename T > std::ostream & printValue( std::ostream & os, const T & value, const boost::false_type & ); template< typename T > std::ostream & printValue( std::ostream & os, const T * value ); template< typename T > std::ostream & printValue( std::ostream & os, T * value ); std::ostream & printValue( std::ostream & os, char value ); std::ostream & printValue( std::ostream & os, unsigned char value ); std::ostream & printValue( std::ostream & os, float value ); std::ostream & printValue( std::ostream & os, double value ); std::ostream & printValue( std::ostream & os, long double value ); } // namespace check_functions_detail } // namespace debug } // namespace walberla #include "CheckFunctions.impl.h" /// \endcond