00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef PXFOUNDATION_PXASSERT_H
00031 #define PXFOUNDATION_PXASSERT_H
00032
00036 #include "foundation/Px.h"
00037
00038 #if !PX_DOXYGEN
00039 namespace physx
00040 {
00041 #endif
00042
00043
00044 class PxAssertHandler
00045 {
00046 public:
00047 virtual ~PxAssertHandler()
00048 {
00049 }
00050 virtual void operator()(const char* exp, const char* file, int line, bool& ignore) = 0;
00051 };
00052
00053 PX_FOUNDATION_API PxAssertHandler& PxGetAssertHandler();
00054 PX_FOUNDATION_API void PxSetAssertHandler(PxAssertHandler& handler);
00055
00056 #if !PX_DOXYGEN
00057 }
00058 #endif
00059
00060 #if !PX_ENABLE_ASSERTS
00061 #define PX_ASSERT(exp) ((void)0)
00062 #define PX_ALWAYS_ASSERT_MESSAGE(exp) ((void)0)
00063 #define PX_ASSERT_WITH_MESSAGE(condition, message) ((void)0)
00064 #else
00065 #if PX_VC
00066 #define PX_CODE_ANALYSIS_ASSUME(exp) \
00067 __analysis_assume(!!(exp)) // This macro will be used to get rid of analysis warning messages if a PX_ASSERT is used
00068
00069 #else
00070 #define PX_CODE_ANALYSIS_ASSUME(exp)
00071 #endif
00072 #define PX_ASSERT(exp) \
00073 { \
00074 static bool _ignore = false; \
00075 ((void)((!!(exp)) || (!_ignore && (physx::PxGetAssertHandler()(#exp, __FILE__, __LINE__, _ignore), false)))); \
00076 PX_CODE_ANALYSIS_ASSUME(exp); \
00077 }
00078 #define PX_ALWAYS_ASSERT_MESSAGE(exp) \
00079 { \
00080 static bool _ignore = false; \
00081 if(!_ignore) \
00082 physx::PxGetAssertHandler()(exp, __FILE__, __LINE__, _ignore); \
00083 }
00084 #define PX_ASSERT_WITH_MESSAGE(exp, message) \
00085 { \
00086 static bool _ignore = false; \
00087 ((void)((!!(exp)) || (!_ignore && (physx::PxGetAssertHandler()(message, __FILE__, __LINE__, _ignore), false)))); \
00088 PX_CODE_ANALYSIS_ASSUME(exp); \
00089 }
00090 #endif
00091
00092 #define PX_ALWAYS_ASSERT() PX_ASSERT(0)
00093
00095 #endif // #ifndef PXFOUNDATION_PXASSERT_H