Virtual Testbed
Ship dynamics simulator for extreme conditions
LogGuard.hh
1 #ifndef VTESTBED_GUI_LOGGUARD_HH
2 #define VTESTBED_GUI_LOGGUARD_HH
3 
4 #include <iostream>
5 #include <streambuf>
6 
7 #include <vtestbed/gui/CircularLineBuffer.hh>
8 #include <vtestbed/gui/LogStreamBuffer.hh>
9 
10 namespace vtb {
11 
12  namespace gui {
13 
14  class LogGuard {
15 
16  private:
17  CircularLineBuffer _lineBuffer;
18  std::streambuf *_oldclog, *_oldcerr, *_oldcout;
19  LogStreamBuffer _newclog, _newcerr, _newcout;
20 
21  public:
22 
23  inline
24  LogGuard():
25  _oldclog(std::clog.rdbuf()), _oldcerr(std::cerr.rdbuf()),
26  _newclog(std::clog.rdbuf(), &_lineBuffer, LogLineMarker::Log),
27  _newcerr(std::cerr.rdbuf(), &_lineBuffer, LogLineMarker::Error),
28  _newcout(std::cout.rdbuf(), &_lineBuffer, LogLineMarker::Output) {
29  std::clog.rdbuf(&_newclog);
30  std::cerr.rdbuf(&_newcerr);
31  std::cout.rdbuf(&_newcout);
32  }
33 
34  inline
35  ~LogGuard() {
36  std::clog.rdbuf(_oldclog);
37  std::cerr.rdbuf(_oldcerr);
38  std::cout.rdbuf(_oldcout);
39  }
40 
41  inline CircularLineBuffer& line_buffer() { return this->_lineBuffer; }
42 
43  };
44 
45  }
46 
47 }
48 
49 #endif // vim:filetype=cpp
Main namespace.
Definition: convert.hh:9