This commit was manufactured by cvs2svn to create tag
[lyx.git] / src / support / DebugStream.h
blob8952248bf2e0f964c484ec4c9bbffdefc738012d
1 // -*- C++ -*-
3 // Created by Lars Gullik Bjønnes
4 // Copyright 1999 Lars Gullik Bjønnes (larsbj@lyx.org)
5 // Released under the Gnu General Public License
7 // Implemented and tested on g++ 2.7.2.3
9 // Primarily developed for use in the LyX Project http://www.lyx.org/
10 // but should be adaptable to any project.
12 #ifndef DEBUGSTREAM_H
13 #define DEBUGSTREAM_H
15 #include "LOstream.h"
17 #ifdef TEST_DEBUGSTREAM
18 #include <string>
19 struct Debug {
20 ///
21 enum type {
22 ///
23 NONE = 0,
24 ///
25 INFO = (1 << 0), // 1
26 ///
27 WARN = (1 << 1), // 2
28 ///
29 CRIT = (1 << 2) // 4
31 ///
32 static const type ANY = type(INFO | WARN | CRIT);
34 /** A function to convert symbolic string names on debug levels
35 to their numerical value.
37 static Debug::type value(std::string const & val) {
38 if (val == "NONE") return Debug::NONE;
39 if (val == "INFO") return Debug::INFO;
40 if (val == "WARN") return Debug::WARN;
41 if (val == "CRIT") return Debug::CRIT;
42 return Debug::NONE;
46 #endif
48 /** DebugStream is a ostream intended for debug output. It has also support
49 for a logfile. Debug output is output to cerr and if the logfile is set,
50 to the logfile.
52 Example of Usage:
53 DebugStream debug;
54 debug.level(Debug::INFO);
55 debug.debug(Debug::WARN) << "WARN\n";
56 debug[Debug::INFO] << "INFO\n";
57 debug << "Always\n";
59 Will output:
60 INFO
61 Always
63 If you want to have debug output from time critical code you should
64 use this construct:
65 if (debug.debugging(Debug::INFO)) {
66 debug << "...debug output...\n";
69 To give debug info even if no debug (NONE) is requested:
70 debug << "... always output ...\n";
72 To give debug output regardless of what debug level is set (!NONE):
73 debug.debug() << "...on debug output...\n";
74 debug[Debug::ANY] << "...on debug output...\n";
76 To give debug output when a specific debug level is set (INFO):
77 debug.debug(Debug::INFO) << "...info...\n";
78 debug[Debug::INFO] << "...info...\n";
80 To give debug output when either on of debug levels is set (INFO or CRIT):
81 debug.debug(Debug::type(Debug::INFO | Debug::CRIT)) << "...info/crit...\n";
82 debug[Debug::type(Debug::INFO | Debug::CRIT)] << "...info/crit...\n";
85 class DebugStream : public ostream {
86 public:
87 /// Constructor, sets the debug level to t.
88 DebugStream(Debug::type t = Debug::NONE);
90 /// Constructor, sets the log file to f, and the debug level to t.
91 DebugStream(char const * f, Debug::type t = Debug::NONE);
93 ///
94 virtual ~DebugStream();
96 /// Sets the debug level to t.
97 void level(Debug::type t) {
98 dt = Debug::type(t & Debug::ANY);
101 /// Returns the current debug level.
102 Debug::type level() const {
103 return dt;
106 /// Adds t to the current debug level.
107 void addLevel(Debug::type t) {
108 dt = Debug::type(dt | t);
111 /// Deletes t from the current debug level.
112 void delLevel(Debug::type t) {
113 dt = Debug::type(dt & ~t);
116 /// Sets the debugstreams' logfile to f.
117 void logFile(char const * f);
119 /// Returns true if t is part of the current debug level.
120 bool debugging(Debug::type t = Debug::ANY) const
122 if (dt & t) return true;
123 return false;
127 /** Returns the no-op stream if t is not part of the
128 current debug level otherwise the real debug stream
129 is used.
131 ostream & debug(Debug::type t = Debug::ANY) {
132 if (dt & t) return *this;
133 return nullstream;
137 /** This is an operator to give a more convenient use:
138 dbgstream[Debug::INFO] << "Info!\n";
140 ostream & operator[](Debug::type t) {
141 return debug(t);
143 private:
144 /// The current debug level
145 Debug::type dt;
146 /// The no-op stream.
147 ostream nullstream;
148 struct debugstream_internal;
149 debugstream_internal * internal;
152 #endif