00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __GZ_DEBUG_H__
00025 #define __GZ_DEBUG_H__
00026
00040 #include "gzBasicTypes.h"
00041 #include "gzTemplates.h"
00042 #include "gzHashUtils.h"
00043 #include "gzMemory.h"
00044 #include "gzReference.h"
00045 #include "gzArgument.h"
00046
00047
00048
00050 class GZ_BASE_EXPORT gzTrace
00051 {
00052 public:
00053 static gzVoid TraceMessage(const char * pszFormat, ARG_DECL_LIST );
00054 static gzVoid NoTraceMessage(const char * pszFormat, ARG_DECL_LIST ){};
00055 static gzVoid TraceMessageSender(const gzString& sender ,const char * pszFormat, ARG_DECL_LIST );
00056 static gzVoid NoTraceMessageSender(const gzString& sender ,const char * pszFormat, ARG_DECL_LIST ){};
00057
00058 };
00059
00066
00067 enum gzDebugFlags
00068 {
00069 GZ_DEBUG_OFF = 0,
00070 GZ_DEBUG_SHOW_ALL = 0xffffffff,
00071 };
00072
00073 GZ_USE_BIT_LOGIC(gzDebugFlags);
00074
00081 class gzString;
00082
00083 class GZ_BASE_EXPORT gzDebugInterface
00084 {
00085 public:
00086 gzVoid debug(gzDebugFlags features=GZ_DEBUG_SHOW_ALL);
00087 virtual ~gzDebugInterface(){};
00088 virtual gzVoid debugOutput(gzString base , gzString anchor , gzDebugFlags features);
00089 virtual gzVoid debugOutputTraverse(gzString base , gzString anchor , gzDebugFlags features);
00090 };
00091
00092
00093 #ifdef GZ_DEBUG
00094 #define GZTRACE gzTrace::TraceMessage
00095 #define GZTRACES gzTrace::TraceMessageSender
00096 #else
00097 #define GZTRACE gzTrace::NoTraceMessage
00098 #define GZTRACES gzTrace::NoTraceMessageSender
00099 #endif
00100
00102
00108 typedef enum {
00109 GZ_MESSAGE_MEM_DEBUG =0x1000 ,
00110 GZ_MESSAGE_PERF_DEBUG =0x1001 ,
00111 GZ_MESSAGE_DEBUG =0x2000 ,
00112 GZ_MESSAGE_TRACE_DEBUG =0x2001 ,
00113 GZ_MESSAGE_NOTICE =0x3000 ,
00114 GZ_MESSAGE_WARNING =0x4000 ,
00115 GZ_MESSAGE_FATAL =0x5000 ,
00116 GZ_MESSAGE_ASSERT =0x6000 ,
00117 GZ_MESSAGE_ALWAYS =0x7000 ,
00118 GZ_MESSAGE_LEVEL_MASK =0xf0ff ,
00119
00120 } gzMessageLevel;
00121
00122
00123 typedef enum {
00124 GZ_MESSAGE_ENCODING_UTF8 = 0,
00125 GZ_MESSAGE_ENCODING_ASCII = (1<<8),
00126 GZ_MESSAGE_ENCODING_NO_TRANSLATE = (1<<9),
00127 GZ_MESSAGE_ENCODING_NO_FORMAT = (1<<10),
00128 } gzMessageEncoding;
00129
00130 typedef enum {
00131 GZ_MESSAGE_API_INTERNAL = (1<<11),
00132 } gzMessageType;
00133
00135 GZ_USE_BIT_LOGIC_MIX(gzMessageLevel,gzMessageEncoding);
00136 GZ_USE_BIT_LOGIC_MIX(gzMessageLevel,gzMessageType);
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 class GZ_BASE_EXPORT gzMessageReceiverInterface
00155 {
00156 public:
00157
00158 gzMessageReceiverInterface();
00159 virtual ~gzMessageReceiverInterface();
00160
00161
00162 virtual gzVoid onMessage(const gzString& sender , gzMessageLevel level , const char *message)=0;
00163
00164 };
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180 class gzMessageTranslatorInterface
00181 {
00182 public:
00183
00184 GZ_BASE_EXPORT gzMessageTranslatorInterface();
00185 GZ_BASE_EXPORT virtual ~gzMessageTranslatorInterface();
00186
00187
00188 GZ_BASE_EXPORT virtual gzString onTranslate(const gzString& sender , gzMessageLevel level , const gzString &message)=0;
00189
00190 GZ_BASE_EXPORT static gzVoid setCurrentLanguage(const gzString &language);
00191
00192 GZ_BASE_EXPORT static const gzString & getCurrentLanguage();
00193
00194 GZ_BASE_EXPORT static gzVoid useDefaultTranslator(gzBool on);
00195
00196 private:
00197
00198 GZ_BASE_EXPORT static gzString s_currentLanguage;
00199 };
00200
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224 class gzMessage
00225 {
00226 public:
00228 GZ_BASE_EXPORT static gzVoid setMessageLevel(gzMessageLevel level);
00229
00231
00232 GZ_BASE_EXPORT static gzMessageLevel getMessageLevel();
00233
00235 GZ_BASE_EXPORT static gzVoid addMessageReceiver(gzMessageReceiverInterface *foo);
00236
00238 GZ_BASE_EXPORT static gzVoid removeMessageReceiver(gzMessageReceiverInterface *foo);
00239
00241 GZ_BASE_EXPORT static gzVoid setMessageTranslator(gzMessageTranslatorInterface *foo);
00242 GZ_BASE_EXPORT static gzMessageTranslatorInterface* getMessageTranslator();
00243 GZ_BASE_EXPORT static gzString translate(const gzString& user,const gzString &message);
00244
00245 GZ_BASE_EXPORT static gzMessageTranslatorInterface * getDefaultMessageTranslator();
00246
00248 GZ_BASE_EXPORT static gzVoid message(const gzString& sender , gzMessageLevel level , const char *fmt , ARG_DECL_LIST );
00249 GZ_BASE_EXPORT static gzVoid message(gzMessageLevel level , const char *fmt , ARG_DECL_LIST );
00250
00251 GZ_BASE_EXPORT static gzVoid message(const gzString& sender , gzMessageLevel level , const gzWideChar *fmtWide , ARG_DECL_LIST );
00252 GZ_BASE_EXPORT static gzVoid message(gzMessageLevel level , const gzWideChar *fmtWide , ARG_DECL_LIST );
00253
00254 GZ_BASE_EXPORT static gzMessageReceiverInterface * getDefaultMessageReceiver();
00255
00256 private:
00257
00258 static gzMessageLevel s_messageLevel;
00259 static gzList<gzMessageReceiverInterface> s_messageReceivers;
00260 static gzMessageTranslatorInterface *s_messageTranslator;
00261 };
00262
00264 #define GZMESSAGE gzMessage::message
00265
00267 #define GZ_TR(x) gzMessage::translate("GizmoSDK",x)
00268
00270 #define GZTR(sender,x) gzMessage::translate(sender,x)
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00288 class gzProgressInterface
00289 {
00290 public:
00291
00292 GZ_BASE_EXPORT gzProgressInterface();
00293
00294 GZ_BASE_EXPORT virtual ~gzProgressInterface();
00295
00296 GZ_BASE_EXPORT virtual gzVoid onProgress( gzUByte percent , const char *message );
00297
00298 GZ_BASE_EXPORT gzVoid activateProgressInterface();
00299
00300 GZ_BASE_EXPORT gzVoid deactivateProgressInterface();
00301
00302 GZ_BASE_EXPORT gzVoid routeProgress(gzUByte percent , const char *message);
00303
00304 private:
00305
00306 gzProgressInterface *m_currentDefaultProgressInterface;
00307
00308 gzBool m_hasDefaultInterface:1;
00309
00310 gzBool m_threadAware:1;
00311 };
00312
00322 class gzProgress
00323 {
00324 public:
00326
00328 GZ_BASE_EXPORT static gzProgressInterface *setProgressInterface(gzProgressInterface *progress_interface);
00329
00331 GZ_BASE_EXPORT static gzProgressInterface *getProgressInterface();
00332
00334
00336 GZ_BASE_EXPORT static gzProgressInterface *setDefaultProgressInterface(gzProgressInterface *progress_interface);
00337
00339
00344 GZ_BASE_EXPORT static gzVoid progress(gzUByte percent , const char *message );
00345
00346 private:
00347
00348 friend class gzProgressInterface;
00349
00350 static gzDict<gzValueCompareInterface,gzProgressInterface> s_progressInterfaces;
00351 static gzProgressInterface * s_defaultProgressInterface;
00352
00353 };
00354
00355 #if defined GZ_WIN32
00356 #if _MSC_VER < 1300
00357 #define GZBREAK {__asm int 3}
00358 #else
00359 #define GZBREAK __debugbreak()
00360 #endif
00361 #else
00362 #define GZBREAK kill(getpid(), SIGTRAP)
00363 #endif
00364
00365 #if defined GZ_WIN32
00366 #if _MSC_VER < 1300
00367 #define GZBRKTST if(err.getErrorCode()==9999){__asm int 3}else throw;
00368 #else
00369 #define GZBRKTST if(err.getErrorCode()==9999)__debugbreak();else throw;
00370 #endif
00371 #else
00372 #define GZBRKTST
00373 #endif
00374
00375
00376 #define GZ_VAR_LINE_2(x,y) x##y // A Line dependant variable
00377 #define GZ_VAR_LINE_1(x,y) GZ_VAR_LINE_2(x,y)
00378 #define GZ_VAR_LINE(x) GZ_VAR_LINE_1(x,__LINE__)
00379
00380
00381 #define gzAssert_(test) gzBool GZ_VAR_LINE(_test_);GZ_VAR_LINE(_test_)=(gzBool)!(test);if(GZ_VAR_LINE(_test_))try{GZMESSAGE(GZ_MESSAGE_ASSERT,"Assert (%s) at line %ld in file "__FILE__,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}if(GZ_VAR_LINE(_test_))
00382 #define gzAssertText_(test,text) gzBool GZ_VAR_LINE(_test_);GZ_VAR_LINE(_test_)=(gzBool)!(test);if(GZ_VAR_LINE(_test_))try{GZMESSAGE(GZ_MESSAGE_ASSERT,"Assert '%s' (%s) at line %ld in file "__FILE__,text,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}if(GZ_VAR_LINE(_test_))
00383
00384 #define gzModuleAssert_(module,test) gzBool GZ_VAR_LINE(_test_);GZ_VAR_LINE(_test_)=(gzBool)!(test);if(GZ_VAR_LINE(_test_))try{GZMESSAGE(module,GZ_MESSAGE_ASSERT,"Assert (%s) at line %ld in file "__FILE__,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}if(GZ_VAR_LINE(_test_))
00385 #define gzModuleAssertText_(module,test,text) gzBool GZ_VAR_LINE(_test_);GZ_VAR_LINE(_test_)=(gzBool)!(test);if(GZ_VAR_LINE(_test_))try{GZMESSAGE(module,GZ_MESSAGE_ASSERT,"Assert '%s' (%s) at line %ld in file "__FILE__,text,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}if(GZ_VAR_LINE(_test_))
00386
00387 #define gzLevelAssert_(level,test) gzBool GZ_VAR_LINE(_test_);GZ_VAR_LINE(_test_)=(gzBool)!(test);if(GZ_VAR_LINE(_test_))try{GZMESSAGE(level,"Assert (%s) at line %ld in file "__FILE__,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}if(GZ_VAR_LINE(_test_))
00388 #define gzLevelAssertText_(level,test,text) gzBool GZ_VAR_LINE(_test_);GZ_VAR_LINE(_test_)=(gzBool)!(test);if(GZ_VAR_LINE(_test_))try{GZMESSAGE(level,"Assert '%s' (%s) at line %ld in file "__FILE__,text,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}if(GZ_VAR_LINE(_test_))
00389
00390 #define gzModuleLevelAssert_(module,level,test) gzBool GZ_VAR_LINE(_test_);GZ_VAR_LINE(_test_)=(gzBool)!(test);if(GZ_VAR_LINE(_test_))try{GZMESSAGE(module,level,"Assert (%s) at line %ld in file "__FILE__,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}if(GZ_VAR_LINE(_test_))
00391 #define gzModuleLevelAssertText_(module,level,test,text) gzBool GZ_VAR_LINE(_test_);GZ_VAR_LINE(_test_)=(gzBool)!(test);if(GZ_VAR_LINE(_test_))try{GZMESSAGE(module,level,"Assert '%s' (%s) at line %ld in file "__FILE__,text,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}if(GZ_VAR_LINE(_test_))
00392
00393
00394 #define gzAssert(test) try{if(!(test))GZMESSAGE(GZ_MESSAGE_ASSERT,"Assert (%s) at line %ld in file "__FILE__,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}
00395 #define gzAssertText(test,text) try{if(!(test))GZMESSAGE(GZ_MESSAGE_ASSERT,"Assert '%s' (%s) at line %ld in file "__FILE__,text,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}
00396
00397 #define gzModuleAssert(module,test) try{if(!(test))GZMESSAGE(module,GZ_MESSAGE_ASSERT,"Assert (%s) at line %ld in file "__FILE__,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}
00398 #define gzModuleAssertText(module,test,text) try{if(!(test))GZMESSAGE(module,GZ_MESSAGE_ASSERT,"Assert '%s' (%s) at line %ld in file "__FILE__,text,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}
00399
00400 #define gzLevelAssert(level,test) try{if(!(test))GZMESSAGE(level,"Assert (%s) at line %ld in file "__FILE__,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}
00401 #define gzLevelAssertText(level,test,text) try{if(!(test))GZMESSAGE(level,"Assert '%s' (%s) at line %ld in file "__FILE__,text,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}
00402
00403 #define gzModuleLevelAssert(module,level,test) try{if(!(test))GZMESSAGE(module,level,"Assert (%s) at line %ld in file "__FILE__,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}
00404 #define gzModuleLevelAssertText(module,level,test,text) try{if(!(test))GZMESSAGE(module,level,"Assert '%s' (%s) at line %ld in file "__FILE__,text,#test,__LINE__);}catch(gzBaseError &err){GZBRKTST}
00405
00406
00407 #ifdef GZ_DEBUG
00408
00409 #define GZ_ERRORTEST {while(long error=gzGetError())GZTRACE("Graphics error:%ld at line %ld in file "__FILE__,error,__LINE__);}
00410 #define GZ_ERRORTEST_STOP {if(long error=gzGetError()){GZTRACE("Graphics error:%ld at line %ld in file "__FILE__,error,__LINE__);while(1);}}
00411 #define GZ_TIMER_START(a) gzTimer timerCounter_##a(#a);
00412 #define GZ_TIMER_STOP(a,b) timerCounter_##a.notifyTime(b);
00413
00414
00415
00416
00417 #define GZ_ASSERT_(test) gzAssert_(test)
00418 #define GZ_ASSERT_TEXT_(test,text) gzAssertText_(test,text)
00419
00420 #define GZ_MODULE_ASSERT_(module,test) gzModuleAssert_(module,test)
00421 #define GZ_MODULE_ASSERT_TEXT_(module,test,text) gzModuleAssertText_(module,test,text)
00422
00423 #define GZ_LEVEL_ASSERT_(level,test) gzLevelAssert_(level,test)
00424 #define GZ_LEVEL_ASSERT_TEXT_(level,test,text) gzLevelAssertText_(level,test,text)
00425
00426 #define GZ_MODULE_LEVEL_ASSERT_(module,level,test) gzModuleLevelAssert_(module,level,test)
00427 #define GZ_MODULE_LEVEL_ASSERT_TEXT_(module,level,test,text) gzModuleLevelAssertText_(module,level,test,text)
00428
00429
00430 #define GZ_ASSERT(test) gzAssert(test)
00431 #define GZ_ASSERT_TEXT(test,text) gzAssertText(test,text)
00432
00433 #define GZ_MODULE_ASSERT(module,test) gzModuleAssert(module,test)
00434 #define GZ_MODULE_ASSERT_TEXT(module,test,text) gzModuleAssertText(module,test,text)
00435
00436 #define GZ_LEVEL_ASSERT(level,test) gzLevelAssert(level,test)
00437 #define GZ_LEVEL_ASSERT_TEXT(level,test,text) gzLevelAssertText(level,test,text)
00438
00439 #define GZ_MODULE_LEVEL_ASSERT(module,level,test) gzModuleLevelAssert(module,level,test)
00440 #define GZ_MODULE_LEVEL_ASSERT_TEXT(module,level,test,text) gzModuleLevelAssertText(module,level,test,text)
00441
00442 #else
00443
00444 #define GZ_ERRORTEST ;
00445 #define GZ_ERRORTEST_STOP ;
00446 #define GZ_TIMER_START(a) ;
00447 #define GZ_TIMER_STOP(a,b) ;
00448
00449
00450 #define GZ_ASSERT_(a) if(FALSE)
00451 #define GZ_ASSERT_TEXT_(a,b) if(FALSE)
00452 #define GZ_MODULE_ASSERT_(a,b) if(FALSE)
00453 #define GZ_MODULE_ASSERT_TEXT_(a,b,c) if(FALSE)
00454 #define GZ_LEVEL_ASSERT_(a,b) if(FALSE)
00455 #define GZ_LEVEL_ASSERT_TEXT_(a,b,c) if(FALSE)
00456 #define GZ_MODULE_LEVEL_ASSERT_(a,b,c) if(FALSE)
00457 #define GZ_MODULE_LEVEL_ASSERT_TEXT_(a,b,c,d) if(FALSE)
00458
00459
00460 #define GZ_ASSERT(a) ;
00461 #define GZ_ASSERT_TEXT(a,b) ;
00462 #define GZ_MODULE_ASSERT(a,b) ;
00463 #define GZ_MODULE_ASSERT_TEXT(a,b,c) ;
00464 #define GZ_LEVEL_ASSERT(a,b) ;
00465 #define GZ_LEVEL_ASSERT_TEXT(a,b,c) ;
00466 #define GZ_MODULE_LEVEL_ASSERT(a,b,c) ;
00467 #define GZ_MODULE_LEVEL_ASSERT_TEXT(a,b,c,d) ;
00468
00469 #endif
00470
00471
00472 #define GZ_XXX GZ_ASSERT_TEXT(FALSE,"Unimplemented Code Path")
00473
00474 #endif