[KLF Backend][KLF Tools][KLF Home]
KLatexFormula Project
src/klftools/klfdebug.h
Go to the documentation of this file.
00001 /***************************************************************************
00002  *   file klfdebug.h
00003  *   This file is part of the KLatexFormula Project.
00004  *   Copyright (C) 2011 by Philippe Faist
00005  *   philippe.faist at bluewin.ch
00006  *                                                                         *
00007  *   This program is free software; you can redistribute it and/or modify  *
00008  *   it under the terms of the GNU General Public License as published by  *
00009  *   the Free Software Foundation; either version 2 of the License, or     *
00010  *   (at your option) any later version.                                   *
00011  *                                                                         *
00012  *   This program is distributed in the hope that it will be useful,       *
00013  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00014  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00015  *   GNU General Public License for more details.                          *
00016  *                                                                         *
00017  *   You should have received a copy of the GNU General Public License     *
00018  *   along with this program; if not, write to the                         *
00019  *   Free Software Foundation, Inc.,                                       *
00020  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00021  ***************************************************************************/
00022 /* $Id$ */
00023 
00024 #ifndef KLFDEBUG_H
00025 #define KLFDEBUG_H
00026 
00027 #include <QMap>
00028 
00029 #include <klfdefs.h>
00030 
00031 // Note: function definitions are in klfdefs.cpp
00032 
00033 
00034 // DEBUG UTILITIES (SOME WITH TIME PRINTING FOR TIMING OPERATIONS)
00035 
00036 KLF_EXPORT QByteArray klfShortFuncSignature(const QByteArray& fullFuncName);
00037 inline QByteArray klfShortFuncSignature(const char *fullFuncName)
00038 { return klfShortFuncSignature(QByteArray(fullFuncName)); }
00039 
00040 KLF_EXPORT QString klfTimeOfDay(bool shortFmt = true);
00041 
00042 #define KLF_SHORT_TIME qPrintable(klfTimeOfDay())
00043 
00044 
00045 class KLF_EXPORT KLFDebugBlock
00046 {
00047 public:
00048   KLFDebugBlock(const QString& blockName);
00049   KLFDebugBlock(bool printmsg, const QString& blockName);
00050 
00051   virtual ~KLFDebugBlock();
00052 
00053 protected:
00054   QString pBlockName;
00055 private:
00056   bool pPrintMsg;
00057 };
00058 
00059 class KLF_EXPORT KLFDebugBlockTimer : public KLFDebugBlock
00060 {
00061 public:
00062   KLFDebugBlockTimer(const QString& blockName);
00063   virtual ~KLFDebugBlockTimer();
00064 };
00065 
00066 class KLFDebugObjectWatcherPrivate;
00067 
00068 class KLF_EXPORT KLFDebugObjectWatcher : public QObject
00069 {
00070   Q_OBJECT
00071 public:
00072   static KLFDebugObjectWatcher *getWatcher();
00073 
00074   void registerObjectRefInfo(QObject *object, const QString& refInfo);
00075 public slots:
00076   void debugObjectDestroyedFromSender() { debugObjectDestroyed(const_cast<QObject*>(sender())); }
00077   void debugObjectDestroyed(QObject *object);
00078 private:
00079 
00080   KLFDebugObjectWatcher();
00081   ~KLFDebugObjectWatcher();
00082   static KLFDebugObjectWatcher *instance;
00083 
00084   KLFDebugObjectWatcherPrivate *p;
00085 };
00086 
00087 
00088 // needed anyways for eg. KLF_ASSERT_CONDITION
00089 #include <QDebug>
00090 
00091 
00092 #ifdef KLF_DEBUG
00093 
00094 
00095 KLF_EXPORT  QDebug
00096 /* */ __klf_dbg_hdr(QDebug dbg, const char * funcname, const char *refinstance, const char * shorttime);
00097 
00098 template<class T>
00099 inline const T& __klf_debug_tee(const T& expr)
00100 { qDebug()<<"TEE VALUE: "<<expr; return expr; }
00101 
00102 template<class T>
00103 inline const T& __klf_debug_tee2(const T& expr, QDebug dbg, const char *where, const char *what)
00104 /* NOTE: No ref-inst, because we would then have to provide both KLF_DEBUG_TEE() and KLF_DEBUG_TEE_ST()
00105  * or similar, like klfDbgSt(). */
00106 { __klf_dbg_hdr(dbg, where, NULL, NULL)<<"`"<<what<<"': "<<expr; return expr; }
00107 
00108 
00109 inline QString __klf_debug_ref_instance() { return QString(); }
00110 #  define KLF_DEBUG_DECLARE_REF_INSTANCE( expr )                        \
00111   protected: inline QString __klf_debug_ref_instance() const { return QString("[")+ (expr) + "]" ; }
00112 
00113 #  define KLF_DEBUG_DECLARE_ASSIGNABLE_REF_INSTANCE()                   \
00114   public: QString __klf_debug_this_ref_instance;                        \
00115   protected: inline QString __klf_debug_ref_instance() const { return __klf_debug_this_ref_instance; }
00116 #  define KLF_DEBUG_ASSIGN_REF_INSTANCE(object, ref_instance)   \
00117   (object)->__klf_debug_this_ref_instance = QString("[%1]").arg((ref_instance))
00118 #  define KLF_DEBUG_ASSIGN_SAME_REF_INSTANCE(object)                    \
00119   (object)->__klf_debug_this_ref_instance = __klf_debug_ref_instance();
00120 
00121 #  define KLF_DEBUG_TIME_BLOCK(msg) KLFDebugBlockTimer __klf_debug_timer_block(QString("")+msg)
00122 #  define KLF_DEBUG_BLOCK(msg) KLFDebugBlock __klf_debug_block(QString("")+msg)
00123 #  define KLF_DEBUG_TEE(expr)                                           \
00124   __klf_debug_tee2(expr, qDebug(), KLF_FUNC_NAME, #expr)
00125 #  define klfDebugf( arglist ) qDebug arglist
00126 #  define klfDbg( streamableItems )                             \
00127   __klf_dbg_hdr(qDebug(), KLF_FUNC_NAME, qPrintable(__klf_debug_ref_instance()), NULL) << streamableItems
00128 #  define klfDbgT( streamableItems )                                    \
00129   __klf_dbg_hdr(qDebug(), KLF_FUNC_NAME, qPrintable(__klf_debug_ref_instance()), KLF_SHORT_TIME) << streamableItems
00130 #  define klfDbgSt( streamableItems )                           \
00131   __klf_dbg_hdr(qDebug(), KLF_FUNC_NAME, NULL, NULL) << streamableItems
00132 #  define klfDbgStT( streamableItems )                                  \
00133   __klf_dbg_hdr(qDebug(), KLF_FUNC_NAME, NULL, KLF_SHORT_TIME) << streamableItems
00134 
00135 #  define KLF_DEBUG_WATCH_OBJECT( qobj )                                \
00136   { KLFDebugObjectWatcher::getWatcher()->registerObjectRefInfo((qobj), #qobj) ; \
00137     connect((qobj), SIGNAL(destroyed()),                                \
00138             KLFDebugObjectWatcher::getWatcher(), SLOT(debugObjectDestroyedFromSender())); \
00139   }
00140 
00141 
00142 #else // KLF_DEBUG
00143 
00144 
00145 #  define KLF_DEBUG_DECLARE_REF_INSTANCE( expr )
00146 #  define KLF_DEBUG_DECLARE_ASSIGNABLE_REF_INSTANCE()
00147 #  define KLF_DEBUG_ASSIGN_REF_INSTANCE(object, ref_instance)
00148 #  define KLF_DEBUG_ASSIGN_SAME_REF_INSTANCE(object)
00149 
00150 
00151 #  define KLF_DEBUG_TIME_BLOCK(msg)
00152 #  define KLF_DEBUG_BLOCK(msg)
00153 
00154 #  define KLF_DEBUG_TEE(expr) (expr)
00155 
00156 #  define klfDebugf(arglist)
00157 
00158 #  define klfDbg( streamableItems )
00159 #  define klfDbgT( streamableItems )
00160 #  define klfDbgSt( streamableItems )
00161 #  define klfDbgStT( streamableItems )
00162 
00163 #  define KLF_DEBUG_WATCH_OBJECT( qobj )
00164 
00165 #endif // KLF_DEBUG
00166 
00167 
00168 KLF_EXPORT  QDebug
00169 /* */ __klf_warning_hdr(QDebug warnstr, const char * funcname, const char * shorttime);
00170 
00171 #define klfWarning(streamableItems) __klf_warning_hdr(qWarning(), KLF_FUNC_NAME, KLF_SHORT_TIME) << streamableItems
00172 
00173 
00174 /* Ensure a usable __func__ symbol */
00175 #if defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L
00176 #  if defined(__GNUC__) && __GNUC__ >= 2
00177 #    define __func__ __FUNCTION__
00178 #  else
00179 #    define __func__ (qPrintable(QString("<in %2 line %1>").arg(__LINE__).arg(__FILE__)))
00180 #  endif
00181 #endif
00182 /* The following declaration tests are inspired from "qglobal.h" in Qt 4.6.2 source code */
00183 #ifndef KLF_FUNC_NAME
00184 #  if (defined(Q_CC_GNU) && !defined(Q_OS_SOLARIS)) || defined(Q_CC_HPACC) || defined(Q_CC_DIAB)
00185 #    define KLF_FUNC_NAME  (klfShortFuncSignature(__PRETTY_FUNCTION__).data())
00186 #  elif defined(_MSC_VER)
00187     /* MSVC 2002 doesn't have __FUNCSIG__ */
00188 #    if _MSC_VER <= 1300
00189 #        define KLF_FUNC_NAME  __func__
00190 #    else
00191 #        define KLF_FUNC_NAME  (klfShortFuncSignature(__FUNCSIG__).data())
00192 #    endif
00193 #  else
00194 #    define KLF_FUNC_NAME __func__
00195 #  endif
00196 #endif
00197 
00198 
00199 
00200 
00201 #define KLF_ASSERT_CONDITION(expr, msg, failaction)                    \
00202   klfDbgSt("KLF_ASSERT_CONDITION(" #expr ")") ;                        \
00203   if ( !(expr) ) {                                                     \
00204     klfWarning(msg);                                                   \
00205     failaction;                                                        \
00206   }
00207 #define KLF_ASSERT_CONDITION_ELSE(expr, msg, failaction)        \
00208   KLF_ASSERT_CONDITION(expr, msg, failaction)                   \
00209   else
00210 #define KLF_ASSERT_NOT_NULL(ptr, msg, failaction)       \
00211   KLF_ASSERT_CONDITION((ptr) != NULL, msg, failaction)
00212 
00213 
00214 
00215 
00216 #endif

Generated by doxygen 1.7.6.1. The KLatexFormula website is hosted on sourceforge.net