+// if _DEBUG is defined (MS VC++ and others use it in debug builds), define
+// __WXDEBUG__ too
+#ifdef _DEBUG
+ #ifndef __WXDEBUG__
+ #define __WXDEBUG__
+ #endif // !__WXDEBUG__
+#endif // _DEBUG
+
+// if NDEBUG is defined (<assert.h> uses it), undef __WXDEBUG__ and WXDEBUG
+#ifdef NDEBUG
+ #undef __WXDEBUG__
+ #undef WXDEBUG
+#endif // NDEBUG
+
+// if __WXDEBUG__ is defined, make sure that WXDEBUG is defined and >= 1
+#ifdef __WXDEBUG__
+ #if !defined(WXDEBUG) || !WXDEBUG
+ #undef WXDEBUG
+ #define WXDEBUG 1
+ #endif // !WXDEBUG
+#endif // __WXDEBUG__
+
+// ----------------------------------------------------------------------------
+// Debugging macros
+//
+// All debugging macros rely on ASSERT() which in turn calls user-defined
+// OnAssert() function. To keep things simple, it's called even when the
+// expression is TRUE (i.e. everything is ok) and by default does nothing: just
+// returns the same value back. But if you redefine it to do something more sexy
+// (popping up a message box in your favourite GUI, sending you e-mail or
+// whatever) it will affect all ASSERTs, FAILs and CHECKs in your code.
+//
+// Warning: if you don't like advices on programming style, don't read
+// further! ;-)
+//
+// Extensive use of these macros is recommended! Remember that ASSERTs are
+// disabled in final (without __WXDEBUG__ defined) build, so they add strictly
+// nothing to your program's code. On the other hand, CHECK macros do stay
+// even in release builds, but in general are not much of a burden, while
+// a judicious use of them might increase your program's stability.
+// ----------------------------------------------------------------------------