OpenADFortTk (basic)
src/lib/support/Diagnostics.h
Go to the documentation of this file.
00001 // -*-Mode: C++;-*-
00002 // $Header: /Volumes/cvsrep/developer/OpenADFortTk/src/lib/support/diagnostics.h,v 1.11 2005/03/19 22:54:51 eraxxon Exp $
00003 #ifndef Diagnostics_INCLUDED
00004 #define Diagnostics_INCLUDED
00005 
00006 #include "Exception.h"
00007 
00008 namespace fortTkSupport {
00009 
00015   class Diagnostics { 
00016   public: 
00017     static void setDiagnosticFilterLevel(int lvl);
00018     static int getDiagnosticFilterLevel();
00019     static const char* Unimplemented; 
00020     static const char* UnexpectedInput;
00021     static const char* UnexpectedOpr;
00022     // This routine is called before an error that stops execution.  It is
00023     // especially useful for use with debuggers that do not have good
00024     // exception support.
00025     static void theMostVisitedBreakpointInHistory(const char* filenm = NULL, 
00026                                                   unsigned int lineno = 0);
00027   private: 
00032     static int  ourUserDebugLevel;
00033   };
00034 
00035 } // end namespace 
00036 
00037   // Private debugging level: messages for in-house debugging [0-9]
00038 #define FORTTK_DBG_LVL 0
00039 
00040   // FORTTK_DIAGIF: If public diagnostic level is at least 'level' ...
00041 #define FORTTK_DIAGIF(level) if (level <= fortTkSupport::Diagnostics::getDiagnosticFilterLevel())
00042 
00043   // FORTTK_DIAGIF_DEV: If development diagnostic level is at least 'level' ...
00044 #define FORTTK_DIAGIF_DEV(level) if (level <= FORTTK_DBG_LVL)
00045 
00046   // All of these macros have a parameter named 'streamArgs' for one or
00047   // more ostream arguments. These macros use these arguments to create
00048   // a message string.  Example:
00049   //   if (...) FORTTK_ERR("bad val: '" << v << "'")
00050 
00051   // FORTTK_MSG: Print a message if level satisfies the diagnostic filter
00052 #define FORTTK_MSG(level, streamArgs)                           \
00053   if (level <= fortTkSupport::Diagnostics::getDiagnosticFilterLevel()) {        \
00054     std::cerr << "FortTk: " << streamArgs << std::endl; }
00055 
00056   // FORTTK_DEVMSG: Print a message if private level satisfies the
00057   // private diagnostic filter
00058 #define FORTTK_DEVMSG(level, streamArgs)                                \
00059   if (level <= FORTTK_DBG_LVL) {                                        \
00060     std::cerr << "FortTk[debugLevel=" << level << "]: " << streamArgs << std::endl; }
00061 
00062   // FORTTK_EMSG: Print an error message and continue.
00063 #define FORTTK_EMSG(streamArgs)                                 \
00064   { std::cerr << "FortTk: ERROR:";                                      \
00065     if (fortTkSupport::Diagnostics::getDiagnosticFilterLevel()) {               \
00066       std::cerr << "[" << __FILE__ << ":" << __LINE__ << "]"; } \
00067     std::cerr << ": " << streamArgs << std::endl; }
00068 
00069   // FORTTK_WMSG: Print an warning message and continue.
00070 #define FORTTK_WMSG(streamArgs)                                 \
00071   { std::cerr << "FortTk: WARNING:";                                    \
00072     if (fortTkSupport::Diagnostics::getDiagnosticFilterLevel()) {               \
00073       std::cerr << "[" << __FILE__ << ":" << __LINE__ << "]"; } \
00074     std::cerr << ": " << streamArgs << std::endl; }
00075 
00076   // FORTTK_ASSERT: Throw an assertion (die) if 'expr' evaluates to
00077   // false. Stops at 'FortTk_TheMostVisitedBreakpointInHistory'.
00078 #define FORTTK_ASSERT(expr, streamArgs)         \
00079   if (!(expr)) FORTTK_THROW(streamArgs)
00080 
00081   // FORTTK_ASSERT_WARN: Print a warning if 'expr' evaluates to false.
00082   // Stops at 'FortTk_TheMostVisitedBreakpointInHistory'.
00083 #define FORTTK_ASSERT_WARN(expr, streamArgs)    \
00084   if (!(expr)) FORTTK_WMSG(streamArgs)
00085 
00086   // FORTTK_DIE: Print an error message and die.  Stops at
00087   // 'FortTk_TheMostVisitedBreakpointInHistory'.
00088   // (Equivalent to FORTTK_THROW.)
00089 #define FORTTK_DIE(streamArgs)                  \
00090   FORTTK_THROW(streamArgs)
00091 
00092   // FORTTK_THROW: (C++ only) Throw a fatal exception.  Stops at
00093   // 'FortTk_TheMostVisitedBreakpointInHistory'.
00094   // (Equivalent to FORTTK_DIE.) Based on Jean Utke's code in xaifBooster.
00095 #define FORTTK_THROW(streamArgs)                                        \
00096   { std::ostringstream WeIrDnAmE;                                       \
00097     WeIrDnAmE << streamArgs << std::ends;                               \
00098     throw fortTkSupport::FatalException(WeIrDnAmE.str(), __FILE__, __LINE__); }
00099 
00100 #endif 
00101 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines