4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
7 * \author Lars Gullik Bjønnes
9 * Full author contact details are available in file CREDITS.
12 #ifndef DEBUG_STREAM_HPP
13 #define DEBUG_STREAM_HPP
17 #include <boost/version.hpp>
22 #if BOOST_VERSION < 103300
23 # include <boost/test/detail/nullstream.hpp>
25 # include <boost/test/utils/nullstream.hpp>
29 # define TEMPORARY_DEBUG_MACRO DEBUG
33 #ifdef TEMPORARY_DEBUG_MACRO
34 # define DEBUG TEMPORARY_DEBUG_MACRO
35 # undef TEMPORARY_DEBUG_MACRO
39 template <class dtrait,
41 class traits = std::char_traits<charT> >
42 class basic_debugstream : public std::basic_ostream<charT, traits> {
45 typedef typename debug::type Type;
48 : std::basic_ostream<charT, traits>(0), dt(debug::NONE),
49 realbuf_(0), enabled_(true)
52 /// Constructor, sets the debug level to t.
53 explicit basic_debugstream(std::basic_streambuf<charT, traits> * buf)
54 : std::basic_ostream<charT, traits>(buf), dt(debug::NONE),
55 realbuf_(0), enabled_(true)
58 /// Sets the debug level to t.
63 /// Returns the current debug level.
68 /// Returns true if t is part of the current debug level.
69 bool debugging(Type t = debug::ANY) const
71 if (debug::match(dt, t)) return true;
75 /** Returns the no-op stream if t is not part of the
76 current debug level otherwise the real debug stream
78 Use: dbgstream[Debug::INFO] << "Info!\n";
80 std::basic_ostream<charT, traits> & operator[](Type t) {
81 if (debug::match(dt, t))
85 /// Disable the stream completely
89 realbuf_ = this->rdbuf();
90 rdbuf(nullstream.rdbuf());
94 /// Enable the stream after a possible call of disable()
98 this->rdbuf(realbuf_);
103 /// The current debug level
105 /// The no-op stream.
106 boost::basic_onullstream<charT, traits> nullstream;
107 /// The buffer of the real stream
108 std::streambuf * realbuf_;
109 /// Is the stream enabled?