Gizmo3D

gzDebug.h

Go to the documentation of this file.
00001 //*****************************************************************************
00002 // File         : gzDebug.h
00003 // Module       : gzBase
00004 // Description  : Class definitions and macros for debugging aid
00005 // Author       : Anders Modén      
00006 // Product      : GizmoBase 2.1.1
00007 //      
00008 // Copyright © 2003- Saab Training Systems AB, Sweden
00009 //          
00010 // NOTE:    Gizmo3D is a high performance 3D Scene Graph and effect visualisation 
00011 //          C++ toolkit for Linux, Mac OS X, Windows (Win32) and IRIX® for  
00012 //          usage in Game or VisSim development.
00013 //
00014 //
00015 // Revision History...                          
00016 //                                  
00017 // Who  Date    Description                     
00018 //                                  
00019 // AMO  980819  Created file    
00020 // AMO  000531  Restructured Message Receivers, Allow multiple instances
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 //********************* DEBUG macros *****************************************
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 {                           //LXNN     L=Level X=Encoding NN=user defined
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,        // Default message encoding
00125                 GZ_MESSAGE_ENCODING_ASCII           = (1<<8),   // Plain Ascii
00126                 GZ_MESSAGE_ENCODING_NO_TRANSLATE    = (1<<9),   // Skip translation
00127                 GZ_MESSAGE_ENCODING_NO_FORMAT       = (1<<10),  // Skip formatting options
00128             } gzMessageEncoding;
00129 
00130 typedef enum {
00131                 GZ_MESSAGE_API_INTERNAL             = (1<<11),  // Internal information about API etc.
00132              } gzMessageType;
00133 
00135 GZ_USE_BIT_LOGIC_MIX(gzMessageLevel,gzMessageEncoding);
00136 GZ_USE_BIT_LOGIC_MIX(gzMessageLevel,gzMessageType);
00137 
00138 
00139 
00140 //******************************************************************************
00141 // Class    : gzMessageReceiverInterface
00142 //
00143 // Purpose  : Utility class for message dispatching
00144 //
00145 // Notes    : -
00146 //
00147 // Revision History...
00148 //
00149 // Who  Date    Description
00150 //
00151 // AMO  000531  Created 
00152 //                                  
00153 //******************************************************************************
00154 class GZ_BASE_EXPORT gzMessageReceiverInterface 
00155 {
00156 public:
00157 
00158     gzMessageReceiverInterface();
00159     virtual ~gzMessageReceiverInterface();
00160 
00161     // ------------ the receiver --------------------
00162     virtual gzVoid onMessage(const gzString& sender , gzMessageLevel level , const char *message)=0;
00163 
00164 };
00165 
00166 //******************************************************************************
00167 // Class    : gzMessageTranslatorInterface
00168 //
00169 // Purpose  : Utility class for message translation
00170 //
00171 // Notes    : -
00172 //
00173 // Revision History...
00174 //
00175 // Who  Date    Description
00176 //
00177 // AMO  000531  Created 
00178 //                                  
00179 //******************************************************************************
00180 class gzMessageTranslatorInterface 
00181 {
00182 public:
00183 
00184     GZ_BASE_EXPORT gzMessageTranslatorInterface();
00185     GZ_BASE_EXPORT virtual ~gzMessageTranslatorInterface();
00186 
00187     // ------------ the translator interface --------------------
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 // Class    : gzMessage
00212 //
00213 // Purpose  : Utility class for message dispatching
00214 //
00215 // Notes    : -
00216 //
00217 // Revision History...
00218 //
00219 // Who  Date    Description
00220 //
00221 // AMO  990622  Created 
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 // Class    : gzProgressInterface
00274 //                                  
00275 // Purpose  : Handle progress in Gizmo3D 
00276 //                                  
00277 // Notes    : - 
00278 //                                  
00279 // Revision History...                          
00280 //                                  
00281 // Who  Date    Description                     
00282 //                                  
00283 // AMO  990622  Created 
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 // {} based
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 // Plain
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 // Asserts
00415 
00416 // {} based
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 // Plain
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 // {} based
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 // Plain
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 // Unimplemented code path macro in debug only
00472 #define GZ_XXX  GZ_ASSERT_TEXT(FALSE,"Unimplemented Code Path")
00473 
00474 #endif

Documentation for Gizmo3D generated at Wed Feb 20 11:54:03 2008 by   Saab Training Systems AB, ¸ (c) 2003-and beyond