2003-09-26 14:27:20 +00:00
|
|
|
|
// -*- C++ -*-
|
|
|
|
|
/**
|
2003-10-08 11:31:51 +00:00
|
|
|
|
* \file debugstream.h
|
2003-09-26 14:27:20 +00:00
|
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
|
*
|
|
|
|
|
* \author Lars Gullik Bj<EFBFBD>nnes
|
|
|
|
|
*
|
|
|
|
|
* Full author contact details are available in file CREDITS.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef DEBUG_STREAM_HPP
|
|
|
|
|
#define DEBUG_STREAM_HPP
|
|
|
|
|
|
2003-10-14 13:01:49 +00:00
|
|
|
|
#include <iostream>
|
2003-09-26 14:27:20 +00:00
|
|
|
|
|
2006-03-05 20:49:09 +00:00
|
|
|
|
#include <boost/version.hpp>
|
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
|
|
//namespace lyx {
|
|
|
|
|
|
2006-03-07 08:29:12 +00:00
|
|
|
|
#if BOOST_VERSION < 103300
|
2006-03-05 20:49:09 +00:00
|
|
|
|
# include <boost/test/detail/nullstream.hpp>
|
|
|
|
|
#else
|
|
|
|
|
# include <boost/test/utils/nullstream.hpp>
|
|
|
|
|
#endif
|
2003-09-26 14:27:20 +00:00
|
|
|
|
|
2004-05-20 09:35:30 +00:00
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
# define TEMPORARY_DEBUG_MACRO DEBUG
|
|
|
|
|
# undef DEBUG
|
|
|
|
|
#endif
|
|
|
|
|
|
2003-09-26 14:27:20 +00:00
|
|
|
|
struct debug_trait {
|
|
|
|
|
enum type {
|
|
|
|
|
NONE = 0,
|
|
|
|
|
EMERG = 1,
|
|
|
|
|
ALERT = 2,
|
|
|
|
|
CRIT = 3,
|
|
|
|
|
ERR = 4,
|
|
|
|
|
WARN = 5,
|
|
|
|
|
NOTICE = 6,
|
|
|
|
|
INFO = 7,
|
|
|
|
|
DEBUG = 8,
|
|
|
|
|
ANY = 0xffffff
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static bool match(type a, type b) {
|
|
|
|
|
return (b <= a || (b == ANY && a > NONE));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2004-05-20 09:35:30 +00:00
|
|
|
|
#ifdef TEMPORARY_DEBUG_MACRO
|
|
|
|
|
# define DEBUG TEMPORARY_DEBUG_MACRO
|
|
|
|
|
# undef TEMPORARY_DEBUG_MACRO
|
|
|
|
|
#endif
|
|
|
|
|
|
2003-09-26 14:27:20 +00:00
|
|
|
|
|
|
|
|
|
template <class dtrait,
|
|
|
|
|
class charT = char,
|
|
|
|
|
class traits = std::char_traits<charT> >
|
|
|
|
|
class basic_debugstream : public std::basic_ostream<charT, traits> {
|
|
|
|
|
public:
|
|
|
|
|
typedef dtrait debug;
|
|
|
|
|
typedef typename debug::type Type;
|
|
|
|
|
|
2003-11-01 13:03:03 +00:00
|
|
|
|
basic_debugstream()
|
|
|
|
|
: std::basic_ostream<charT, traits>(0), dt(debug::NONE)
|
|
|
|
|
{}
|
|
|
|
|
|
2003-09-26 14:27:20 +00:00
|
|
|
|
/// Constructor, sets the debug level to t.
|
|
|
|
|
explicit basic_debugstream(std::basic_streambuf<charT, traits> * buf)
|
|
|
|
|
: std::basic_ostream<charT, traits>(buf), dt(debug::NONE)
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
/// Sets the debug level to t.
|
|
|
|
|
void level(Type t) {
|
|
|
|
|
dt = t;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns the current debug level.
|
|
|
|
|
Type level() const {
|
|
|
|
|
return dt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns true if t is part of the current debug level.
|
|
|
|
|
bool debugging(Type t = debug::ANY) const
|
|
|
|
|
{
|
|
|
|
|
if (debug::match(dt, t)) return true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Returns the no-op stream if t is not part of the
|
|
|
|
|
current debug level otherwise the real debug stream
|
|
|
|
|
is used.
|
|
|
|
|
Use: dbgstream[Debug::INFO] << "Info!\n";
|
|
|
|
|
*/
|
|
|
|
|
std::basic_ostream<charT, traits> & operator[](Type t) {
|
|
|
|
|
if (debug::match(dt, t))
|
|
|
|
|
return *this;
|
|
|
|
|
return nullstream;
|
|
|
|
|
}
|
|
|
|
|
private:
|
|
|
|
|
/// The current debug level
|
|
|
|
|
Type dt;
|
|
|
|
|
/// The no-op stream.
|
|
|
|
|
boost::basic_onullstream<charT, traits> nullstream;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef basic_debugstream<debug_trait> debugstream;
|
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
|
|
//} // namespace lyx
|
|
|
|
|
|
2003-09-26 14:27:20 +00:00
|
|
|
|
#endif
|