You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tellico/src/tellico_debug.h

157 lines
4.5 KiB

/***************************************************************************
copyright : (C) 2003-2006 by Robby Stephenson
email : robby@periapsis.org
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of version 2 of the GNU General Public License as *
* published by the Free Software Foundation; *
* *
***************************************************************************/
#ifndef TELLICO_DEBUG_H
#define TELLICO_DEBUG_H
// most of this is borrowed from amarok/src/debug.h
// which is copyright Max Howell <max.howell@methylblue.com>
// amarok is licensed under the GPL
#include <kdebug.h>
// std::clock_t
#include <ctime>
// linux has __GNUC_PREREQ, NetBSD has __GNUC_PREREQ__
#if defined(__GNUC_PREREQ) && !defined(__GNUC_PREREQ__)
#define __GNUC_PREREQ__ __GNUC_PREREQ
#endif
#if !defined(__GNUC_PREREQ__)
#if defined __GNUC__
#define __GNUC_PREREQ__(x, y) \
((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \
(__GNUC__ > (x)))
#else
#define __GNUC_PREREQ__(x, y) 0
#endif
#endif
# if defined __cplusplus ? __GNUC_PREREQ__ (2, 6) : __GNUC_PREREQ__ (2, 4)
# define MY_FUNCTION __PRETTY_FUNCTION__
# else
# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
# define MY_FUNCTION __func__
# else
# define MY_FUNCTION __FILE__ ":" __LINE__
# endif
# endif
// some logging
#ifndef NDEBUG
#define TELLICO_LOG
#endif
#ifndef NDEBUG
#define TELLICO_DEBUG
#endif
namespace Debug {
typedef kndbgstream NoDebugStream;
#ifndef TELLICO_DEBUG
typedef kndbgstream DebugStream;
static inline DebugStream log() { return DebugStream(); }
static inline DebugStream debug() { return DebugStream(); }
static inline DebugStream warning() { return DebugStream(); }
static inline DebugStream error() { return DebugStream(); }
static inline DebugStream fatal() { return DebugStream(); }
#else
#ifndef DEBUG_PREFIX
#define FUNC_PREFIX ""
#else
#define FUNC_PREFIX "[" DEBUG_PREFIX "] "
#endif
//from kdebug.h
/*
enum DebugLevels {
KDEBUG_INFO = 0,
KDEBUG_WARN = 1,
KDEBUG_ERROR = 2,
KDEBUG_FATAL = 3
};
*/
typedef kdbgstream DebugStream;
#ifdef TELLICO_LOG
static inline DebugStream log() { return kdDebug(); }
#else
static inline kndbgstream log() { return NoDebugStream(); }
#endif
static inline DebugStream debug() { return kdDebug() << FUNC_PREFIX; }
static inline DebugStream warning() { return kdWarning() << FUNC_PREFIX << "[WARNING!] "; }
static inline DebugStream error() { return kdError() << FUNC_PREFIX << "[ERROR!] "; }
static inline DebugStream fatal() { return kdFatal() << FUNC_PREFIX; }
#undef FUNC_PREFIX
#endif
class Block {
public:
Block(const char* label) : m_start(std::clock()), m_label(label) {
Debug::debug() << "BEGIN: " << label << endl;
}
~Block() {
std::clock_t finish = std::clock();
const double duration = (double) (finish - m_start) / CLOCKS_PER_SEC;
Debug::debug() << " END: " << m_label << " - duration = " << duration << endl;
}
private :
std::clock_t m_start;
const char* m_label;
};
}
#define myDebug() Debug::debug()
#define myWarning() Debug::warning()
#define myLog() Debug::log()
/// Standard function announcer
#define DEBUG_FUNC_INFO myDebug() << k_funcinfo << endl;
/// Announce a line
#define DEBUG_LINE_INFO myDebug() << k_funcinfo << "Line: " << __LINE__ << endl;
/// Convenience macro for making a standard Debug::Block
#define DEBUG_BLOCK Debug::Block uniquelyNamedStackAllocatedStandardBlock( __func__ );
#ifdef TELLICO_LOG
// see http://www.gnome.org/~federico/news-2006-03.html#timeline-tools
#define MARK do { \
char str[128]; \
::snprintf(str, 128, "MARK: %s: %s (%d)", className(), MY_FUNCTION, __LINE__); \
::access (str, F_OK); \
} while(false)
#define MARK_MSG(s) do { \
char str[128]; \
::snprintf(str, 128, "MARK: %s: %s (%d)", className(), s, __LINE__); \
::access (str, F_OK); \
} while(false)
#define MARK_LINE do { \
char str[128]; \
::snprintf(str, 128, "MARK: tellico: %s (%d)", __FILE__, __LINE__); \
::access (str, F_OK); \
} while(false)
#else
#define MARK
#define MARK_MSG(s)
#define MARK_LINE
#endif
#endif