00001
00002
00003
00004
00005 #ifndef EQBASE_DEBUG_H
00006 #define EQBASE_DEBUG_H
00007
00008 #include <eq/base/defines.h>
00009 #include <eq/base/log.h>
00010
00011
00012 #define EQ_NO_RELEASE_ASSERT
00013
00014 #ifdef NDEBUG
00015 # ifdef EQ_NO_RELEASE_ASSERT
00016 # define EQASSERT( x )
00017 # define EQASSERTINFO( x, info )
00018 # define EQCHECK(x) { x; }
00019 # else
00020 # define EQASSERT(x) { if( !(x) ) \
00021 EQERROR << "##### Assert: " << #x << " #####" << std::endl \
00022 << eq::base::forceFlush; }
00023 # define EQASSERTINFO(x, info) { if( !(x) ) \
00024 EQERROR << "##### Assert: " << #x << " [" << info << "] #####" \
00025 << std::endl << eq::base::forceFlush; }
00026 # define EQCHECK(x) { const bool eqResult = x; EQASSERTINFO( eqResult, #x ) }
00027 # endif
00028 # define EQUNIMPLEMENTED { EQERROR << "Unimplemented code" << std::endl \
00029 << eq::base::forceFlush; }
00030 # define EQUNREACHABLE { EQERROR << "Unreachable code" << std::endl \
00031 << eq::base::forceFlush; }
00032 # define EQDONTCALL \
00033 { EQERROR << "Code is not supposed to be called in this context" \
00034 << std::endl << eq::base::forceFlush; }
00035
00036 #else // DEBUG
00037 namespace eq
00038 {
00039 namespace base
00040 {
00042 EQ_EXPORT void abortDebug();
00043 }
00044 }
00045
00046 # define EQASSERT(x) { if( !(x) ) \
00047 { EQERROR << "Assert: " << #x << std::endl << eq::base::forceFlush; \
00048 eq::base::abortDebug(); }}
00049 # define EQASSERTINFO(x, info) { if( !(x) ) \
00050 { \
00051 EQERROR << "Assert: " << #x << " [" << info << "]" << std::endl \
00052 << eq::base::forceFlush; \
00053 eq::base::abortDebug(); \
00054 }}
00055 # define EQUNIMPLEMENTED \
00056 { EQERROR << "Unimplemented code in " << typeid(*this).name() \
00057 << std::endl << eq::base::forceFlush; \
00058 eq::base::abortDebug(); }
00059 # define EQUNREACHABLE \
00060 { EQERROR << "Unreachable code in " << typeid(*this).name() \
00061 << std::endl << eq::base::forceFlush; \
00062 eq::base::abortDebug(); }
00063 # define EQDONTCALL \
00064 { EQERROR << "Code is not supposed to be called in this context, type " \
00065 << typeid(*this).name() << std::endl << eq::base::forceFlush; \
00066 eq::base::abortDebug(); }
00067
00068 # define EQCHECK(x) { const bool eqResult = x; EQASSERTINFO( eqResult, #x ) }
00069
00070 #endif // DEBUG
00071
00072 #define EQSAFECAST( to, in ) static_cast< to >( in ); \
00073 EQASSERT( in == 0 || dynamic_cast< to >( static_cast< to >( in )))
00074
00075
00076 #endif //EQBASE_DEBUG_H