19 #ifndef INCLUDE_UTIL_ASSERT_HPP
20 #define INCLUDE_UTIL_ASSERT_HPP
26 #include <boost/current_function.hpp>
29 #include "VariableArgMacro.hpp"
31 #if defined(_MSC_VER) && !defined(NDEBUG)
37 class AssertFunctor :
public VariableArgMacroFunctor
41 AssertFunctor() : mExpr(NULL)
45 AssertFunctor(
const char * expr) : mExpr(expr)
49 #if defined(_MSC_VER) && !defined(NDEBUG)
51 #pragma warning(disable: 4995) // 'sprintf': name was marked as #pragma deprecated
52 #pragma warning(disable: 4996) // 'sprintf': This function or variable may be unsafe.
61 std::string values(mArgs->str(),
static_cast<std::size_t
>(mArgs->tellp()));
63 char szBuffer[512] = {0};
64 sprintf(szBuffer,
"%s(%d): Assert failed. Expression: %s.\n", mFile, mLine, mExpr);
65 OutputDebugStringA(szBuffer);
66 std::cout << szBuffer;
67 int ret = _CrtDbgReport(_CRT_ASSERT, mFile, mLine,
"", msg, mExpr, values.c_str(), mFunc);
81 std::string values(mArgs->str(),
static_cast<std::size_t
>(mArgs->tellp()));
84 << mFile <<
":" << mLine
85 <<
": Assertion failed. " << mExpr
86 <<
" . Values: " << values << std::endl;
88 assert(0 &&
"See line above for assertion details.");
105 VarArgAbort &operator()(
const T &)
113 #define UTIL_ASSERT_DEBUG(cond, e, logName, logLevel) \
115 else util::VarArgAssert(__FILE__, __LINE__, #cond)
119 #pragma warning( push )
120 #pragma warning( disable : 4355 ) // warning C4355: 'this' : used in base member initializer list
123 #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
124 #define UTIL_ASSERT_DEBUG_GCC_33_HACK (const util::VariableArgMacro<util::ThrowFunctor> &)
126 #define UTIL_ASSERT_DEBUG_GCC_33_HACK
129 DECLARE_VARIABLE_ARG_MACRO( UTIL_ASSERT_DEBUG, util::AssertFunctor );
130 #define UTIL_ASSERT_DEBUG(expr, e, logName, logLevel) \
133 UTIL_ASSERT_DEBUG_GCC_33_HACK \
134 util::VariableArgMacro<util::AssertFunctor>(#expr) \
140 BOOST_CURRENT_FUNCTION) \
141 .cast( (util::VariableArgMacro<util::AssertFunctor> *) NULL) \
146 #define UTIL_ASSERT_DEBUG_A(x) UTIL_ASSERT_DEBUG_OP(x, B)
147 #define UTIL_ASSERT_DEBUG_B(x) UTIL_ASSERT_DEBUG_OP(x, A)
148 #define UTIL_ASSERT_DEBUG_OP(x, next) UTIL_ASSERT_DEBUG_A.notify_((x), #x).UTIL_ASSERT_DEBUG_ ## next
151 #pragma warning( pop )
157 #ifdef RCF_ALWAYS_ABORT_ON_ASSERT
159 #define UTIL_ASSERT_RELEASE(cond, e, logName, logLevel) \
161 else util::VarArgAbort()
165 #define UTIL_ASSERT_RELEASE(cond, e, logName, logLevel) \
167 else UTIL_THROW(e, logName, logLevel)(cond)
171 #define UTIL_ASSERT_NULL(cond, E) \
172 DUMMY_VARIABLE_ARG_MACRO()
175 #define UTIL_ASSERT UTIL_ASSERT_RELEASE
177 #define UTIL_ASSERT UTIL_ASSERT_DEBUG