+ #undef __WXDEBUG__
+#endif
+
+// Finally there is also a very old WXDEBUG macro not used anywhere at all, it
+// is only defined for compatibility.
+#ifdef __WXDEBUG__
+ #if !defined(WXDEBUG) || !WXDEBUG
+ #undef WXDEBUG
+ #define WXDEBUG 1
+ #endif // !WXDEBUG
+#endif // __WXDEBUG__
+
+// ----------------------------------------------------------------------------
+// Handling assertion failures
+// ----------------------------------------------------------------------------
+
+/*
+ Type for the function called in case of assert failure, see
+ wxSetAssertHandler().
+ */
+typedef void (*wxAssertHandler_t)(const wxString& file,
+ int line,
+ const wxString& func,
+ const wxString& cond,
+ const wxString& msg);
+
+#if wxDEBUG_LEVEL
+
+// the global assert handler function, if it is NULL asserts don't check their
+// conditions
+extern WXDLLIMPEXP_DATA_BASE(wxAssertHandler_t) wxTheAssertHandler;
+
+/*
+ Sets the function to be called in case of assertion failure.
+
+ The default assert handler forwards to wxApp::OnAssertFailure() whose
+ default behaviour is, in turn, to show the standard assertion failure
+ dialog if a wxApp object exists or shows the same dialog itself directly
+ otherwise.
+
+ While usually it is enough -- and more convenient -- to just override
+ OnAssertFailure(), to handle all assertion failures, including those
+ occurring even before wxApp object creation or after its destruction you
+ need to provide your assertion handler function.
+
+ This function also provides a simple way to disable all asserts: simply
+ pass NULL pointer to it. Doing this will result in not even evaluating
+ assert conditions at all, avoiding almost all run-time cost of asserts.
+
+ Notice that this function is not MT-safe, so you should call it before
+ starting any other threads.
+
+ The return value of this function is the previous assertion handler. It can
+ be called after any pre-processing by your handler and can also be restored
+ later if you uninstall your handler.
+ */
+inline wxAssertHandler_t wxSetAssertHandler(wxAssertHandler_t handler)
+{
+ const wxAssertHandler_t old = wxTheAssertHandler;
+ wxTheAssertHandler = handler;
+ return old;
+}
+
+/*
+ Reset the default assert handler.
+
+ This may be used to enable asserts, which are disabled by default in this
+ case, for programs built in release build (NDEBUG defined).
+ */
+extern void WXDLLIMPEXP_BASE wxSetDefaultAssertHandler();
+
+#else // !wxDEBUG_LEVEL
+
+// provide empty stubs in case assertions are completely disabled
+//
+// NB: can't use WXUNUSED() here as we're included from wx/defs.h before it is
+// defined
+inline wxAssertHandler_t wxSetAssertHandler(wxAssertHandler_t /* handler */)
+{
+ return NULL;
+}
+
+inline void wxSetDefaultAssertHandler() { }
+
+#endif // wxDEBUG_LEVEL/!wxDEBUG_LEVEL
+
+// simply a synonym for wxSetAssertHandler(NULL)
+inline void wxDisableAsserts() { wxSetAssertHandler(NULL); }
+
+/*
+ A macro which disables asserts for applications compiled in release build.
+
+ By default, wxIMPLEMENT_APP (or rather wxIMPLEMENT_WXWIN_MAIN) disable the
+ asserts in the applications compiled in the release build by calling this.
+ It does nothing if NDEBUG is not defined.
+ */
+#ifdef NDEBUG
+ #define wxDISABLE_ASSERTS_IN_RELEASE_BUILD() wxDisableAsserts()
+#else
+ #define wxDISABLE_ASSERTS_IN_RELEASE_BUILD()
+#endif
+
+#if wxDEBUG_LEVEL
+
+/*
+ wxOnAssert() is used by the debugging macros defined below. Different
+ overloads are needed because these macros can be used with or without wxT().
+
+ All of them are implemented in src/common/appcmn.cpp and unconditionally
+ call wxTheAssertHandler so the caller must check that it is non-NULL
+ (assert macros do it).
+ */
+
+#if wxUSE_UNICODE
+
+// these overloads are the ones typically used by debugging macros: we have to
+// provide wxChar* msg version because it's common to use wxT() in the macros
+// and finally, we can't use const wx(char)* msg = NULL, because that would
+// be ambiguous
+//
+// also notice that these functions can't be inline as wxString is not defined
+// yet (and can't be as wxString code itself may use assertions)
+extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file,
+ int line,
+ const char *func,
+ const char *cond);
+
+extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file,
+ int line,
+ const char *func,
+ const char *cond,
+ const char *msg);
+
+extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file,
+ int line,
+ const char *func,
+ const char *cond,
+ const wxChar *msg) ;
+#endif /* wxUSE_UNICODE */
+
+// this version is for compatibility with wx 2.8 Unicode build only, we don't
+// use it ourselves any more except in ANSI-only build in which case it is all
+// we need
+extern WXDLLIMPEXP_BASE void wxOnAssert(const wxChar *file,
+ int line,
+ const char *func,
+ const wxChar *cond,
+ const wxChar *msg = NULL);
+
+// these overloads work when msg passed to debug macro is a string and we
+// also have to provide wxCStrData overload to resolve ambiguity which would
+// otherwise arise from wxASSERT( s.c_str() )
+extern WXDLLIMPEXP_BASE void wxOnAssert(const wxString& file,
+ int line,
+ const wxString& func,
+ const wxString& cond,
+ const wxString& msg);
+
+extern WXDLLIMPEXP_BASE void wxOnAssert(const wxString& file,
+ int line,
+ const wxString& func,
+ const wxString& cond);
+
+extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file,
+ int line,
+ const char *func,
+ const char *cond,
+ const wxCStrData& msg);
+
+extern WXDLLIMPEXP_BASE void wxOnAssert(const char *file,
+ int line,
+ const char *func,
+ const char *cond,
+ const wxString& msg);
+
+#endif // wxDEBUG_LEVEL
+
+
+// ----------------------------------------------------------------------------
+// Debugging macros
+// ----------------------------------------------------------------------------
+
+/*
+ Assertion macros: check if the condition is true and call assert handler
+ (which will by default notify the user about failure) if it isn't.
+
+ wxASSERT and wxFAIL macros as well as wxTrap() function do nothing at all
+ if wxDEBUG_LEVEL is 0 however they do check their conditions at default
+ debug level 1, unlike the previous wxWidgets versions.
+
+ wxASSERT_LEVEL_2 is meant to be used for "expensive" asserts which should
+ normally be disabled because they have a big impact on performance and so
+ this macro only does anything if wxDEBUG_LEVEL >= 2.
+ */
+#if wxDEBUG_LEVEL
+ // wxTrap() can be used to break into the debugger unconditionally
+ // (assuming the program is running under debugger, of course).
+ //
+ // If possible, we prefer to define it as a macro rather than as a function
+ // to open the debugger at the position where we trapped and not inside the
+ // trap function itself which is not very useful.
+ #if wxCHECK_VISUALC_VERSION(7)
+ #define wxTrap() __debugbreak()
+ #else
+ extern WXDLLIMPEXP_BASE void wxTrap();
+ #endif // Win VisualC
+
+ // Global flag used to indicate that assert macros should call wxTrap(): it
+ // is set by the default assert handler if the user answers yes to the
+ // question of whether to trap.
+ extern WXDLLIMPEXP_DATA_BASE(bool) wxTrapInAssert;
+
+ // This macro checks if the condition is true and calls the assert handler
+ // with the provided message if it isn't and finally traps if the special
+ // flag indicating that it should do it was set by the handler.
+ //
+ // Notice that we don't use the handler return value for compatibility
+ // reasons (if we changed its return type, we'd need to change wxApp::
+ // OnAssertFailure() too which would break user code overriding it), hence
+ // the need for the ugly global flag.
+ #define wxASSERT_MSG(cond, msg) \
+ wxSTATEMENT_MACRO_BEGIN \
+ if ( wxTheAssertHandler && !(cond) && \
+ (wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, \
+ #cond, msg), wxTrapInAssert) ) \
+ { \
+ wxTrapInAssert = false; \
+ wxTrap(); \
+ } \
+ wxSTATEMENT_MACRO_END
+
+ // a version without any additional message, don't use unless condition
+ // itself is fully self-explanatory
+ #define wxASSERT(cond) wxASSERT_MSG(cond, (const char*)NULL)
+
+ // wxFAIL is a special form of assert: it always triggers (and so is
+ // usually used in normally unreachable code)
+ #define wxFAIL_COND_MSG(cond, msg) \
+ wxSTATEMENT_MACRO_BEGIN \
+ if ( wxTheAssertHandler && \
+ (wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, \
+ cond, msg), wxTrapInAssert) ) \
+ { \
+ wxTrapInAssert = false; \
+ wxTrap(); \
+ } \
+ wxSTATEMENT_MACRO_END
+
+ #define wxFAIL_MSG(msg) wxFAIL_COND_MSG("Assert failure", msg)
+ #define wxFAIL wxFAIL_MSG((const char*)NULL)
+#else // !wxDEBUG_LEVEL
+ #define wxTrap()
+
+ #define wxASSERT(cond)
+ #define wxASSERT_MSG(cond, msg)
+ #define wxFAIL
+ #define wxFAIL_MSG(msg)
+ #define wxFAIL_COND_MSG(cond, msg)
+#endif // wxDEBUG_LEVEL
+
+#if wxDEBUG_LEVEL >= 2
+ #define wxASSERT_LEVEL_2_MSG(cond, msg) wxASSERT_MSG(cond, msg)
+ #define wxASSERT_LEVEL_2(cond) wxASSERT(cond)
+#else // wxDEBUG_LEVEL < 2
+ #define wxASSERT_LEVEL_2_MSG(cond, msg)
+ #define wxASSERT_LEVEL_2(cond)
+#endif
+
+// This is simply a wrapper for the standard abort() which is not available
+// under all platforms.
+//
+// It isn't really debug-related but there doesn't seem to be any better place
+// for it, so declare it here and define it in appbase.cpp, together with
+// wxTrap().
+extern void WXDLLIMPEXP_BASE wxAbort();
+
+/*
+ wxCHECK macros always check their conditions, setting debug level to 0 only
+ makes them silent in case of failure, otherwise -- including at default
+ debug level 1 -- they call the assert handler if the condition is false
+
+ They are supposed to be used only in invalid situation: for example, an
+ invalid parameter (e.g. a NULL pointer) is passed to a function. Instead of
+ dereferencing it and causing core dump the function might use
+
+ wxCHECK_RET( p != NULL, "pointer can't be NULL" )