All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
MsgStream.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_MSGSTREAM_H
2 #define GAUDIKERNEL_MSGSTREAM_H
3 
4 // Include files
7 // Standard C++ classes
8 #include <cstdio>
9 #include <string>
10 #include <iomanip>
11 #include <vector>
12 #include <sstream>
13 
24 class MsgStream {
25 private:
29  typedef std::ios_base::fmtflags FLAG_TYPE;
30  typedef std::ios_base::iostate STATE_TYPE;
31 protected:
41  bool m_active = false;
52  static bool m_countInactive;
53 
54 public:
56  GAUDI_API MsgStream(IMessageSvc* svc, int buffer_length=128);
58  GAUDI_API MsgStream(IMessageSvc* svc, std::string source, int buffer_length=128);
61  : m_service(msg.m_service),
62  m_active(msg.m_active),
63  m_level(msg.m_level),
64  m_currLevel(msg.m_currLevel),
65  m_useColors(msg.m_useColors),
66  m_inactCounter(msg.m_inactCounter)
67  {
68  try { // ignore exception if we cannot copy the string
69  m_source = msg.m_source;
70  }
71  catch (...) {}
72  }
74  GAUDI_API virtual ~MsgStream() = default;
76  MsgStream& report(int lvl) {
77  lvl = (lvl >= MSG::NUM_LEVELS) ?
78  MSG::ALWAYS : (lvl<MSG::NIL) ? MSG::NIL : lvl;
79  if ((m_currLevel=MSG::Level(lvl)) >= level()) {
80  activate();
81  } else {
82  deactivate();
83 #ifndef NDEBUG
84  if (MsgStream::countInactive() && m_inactCounter) {
85  m_inactCounter->incrInactiveCount(MSG::Level(lvl),m_source);
86  }
87 #endif
88  }
89  return *this;
90  }
92  virtual GAUDI_API MsgStream& doOutput();
94  const std::string& buffer() const {
95  return m_buffer;
96  }
99  return m_stream;
100  }
102  void setMsgSvc( IMessageSvc* svc ) {
103  m_service = svc;
104  }
106  void setLevel(int level) {
107  level = (level >= MSG::NUM_LEVELS) ?
108  MSG::ALWAYS : (level<MSG::NIL) ? MSG::NIL : level;
109  m_level = MSG::Level(level);
110  }
113  return m_level;
114  }
117  return m_currLevel;
118  }
120  void activate() {
121  m_active = true;
122  }
124  void deactivate() {
125  m_active = false;
126  }
128  bool isActive() const {
129  return m_active;
130  }
131  // oMsgStream flush emulation
133  if ( isActive() ) m_stream.flush();
134  return *this;
135  }
136  // oMsgStream write emulation
137  MsgStream& write(const char* buff,int len) {
138  if ( isActive() ) m_stream.write(buff, len);
139  return *this;
140  }
143  if ( isActive() ) _f(*this);
144  return *this;
145  }
148  if ( isActive() ) _f(m_stream);
149  return *this;
150  }
152  MsgStream& operator<<(std::ios& (*_f)(std::ios&)) {
153  if ( isActive() ) _f(m_stream);
154  return *this;
155  }
158  return report(level);
159  }
161  try {
162  // this may throw, and we cannot afford it if the stream is used in a catch block
163  if(isActive()) {
164  m_stream << arg;
165  }
166  } catch (...) {}
167  return *this;
168  }
169 
172  if ( isActive() ) _f(m_stream);
173  return *this;
174  }
175 
177  long flags() const {
178  return isActive() ? m_stream.flags() : 0;
179  }
180  long flags(FLAG_TYPE v) {
181  return isActive() ? m_stream.flags(v) : 0;
182  }
183  long setf(FLAG_TYPE v) {
184  return isActive() ? m_stream.setf(v) : 0;
185  }
186  int width() const {
187  return isActive() ? m_stream.width() : 0;
188  }
189  int width(int v) {
190  return isActive() ? m_stream.width(v) : 0;
191  }
192  char fill() const {
193  return isActive() ? m_stream.fill() : (char)-1;
194  }
195  char fill(char v) {
196  return isActive() ? m_stream.fill(v) : (char)-1;
197  }
198  int precision() const {
199  return isActive() ? m_stream.precision(): 0;
200  }
201  int precision(int v) {
202  return isActive() ? m_stream.precision(v): 0;
203  }
204  int rdstate() const {
205  return isActive() ? m_stream.rdstate () : std::ios_base::failbit;
206  }
207  int good() const {
208  return isActive() ? m_stream.good () : 0;
209  }
210  int eof() const {
211  return isActive() ? m_stream.eof () : 0;
212  }
213  int bad() const {
214  return isActive() ? m_stream.bad() : 0;
215  }
216  long setf(FLAG_TYPE _f, FLAG_TYPE _m) {
217  return isActive() ? m_stream.setf(_f, _m) : 0;
218  }
219  void unsetf(FLAG_TYPE _l) {
220  if ( isActive() ) m_stream.unsetf(_l);
221  }
222  void clear(STATE_TYPE _i = std::ios_base::failbit) {
223  if ( isActive() ) m_stream.clear(_i);
224  }
225 
227  GAUDI_API void setColor(MSG::Color col);
230 
232  GAUDI_API void resetColor();
233 
236  static GAUDI_API bool enableCountInactive(bool value = true);
237 
239  static GAUDI_API bool countInactive();
240 
241 };
242 
245  return s.doOutput();
246 }
247 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NO_ENDREQ)
248 [[deprecated("will be removed in v28r1, use endmsg instead, see https://gitlab.cern.ch/gaudi/Gaudi/merge_requests/79")]]
250 inline MsgStream& endreq(MsgStream& s) {
251  return s.doOutput();
252 }
253 #endif
254 
256 GAUDI_API std::string format(const char*, ... );
257 
258 #ifdef _WIN32
259 template<class _E> inline
260 MsgStream& operator<<( MsgStream& s, const std::_Fillobj<_E>& obj) {
261 #if _MSC_VER > 1300
262  if ( s.isActive() ) s.stream().fill(obj._Fill);
263 #else
264  if ( s.isActive() ) s.stream().fill(obj._Ch);
265 #endif
266  return s;
267 }
268 template<class _Tm> inline
269 MsgStream& operator << (MsgStream& s, const std::_Smanip<_Tm>& manip) {
270 #if _MSC_VER > 1300
271  if ( s.isActive() ) (*manip._Pfun)(s.stream(), manip._Manarg);
272 #else
273  if ( s.isActive() ) (*manip._Pf)(s.stream(), manip._Manarg);
274 #endif
275  return s;
276 }
277 #elif defined (__GNUC__)
278 #ifndef __APPLE__
279 inline MsgStream& operator << (MsgStream& s,
280  const std::_Setiosflags &manip) {
281  try {
282  // this may throw, and we cannot afford it if the stream is used in a catch block
283  if ( s.isActive() ) s.stream() << manip;
284  } catch(...) {}
285  return s;
286 }
287 inline MsgStream& operator << (MsgStream& s,
288  const std::_Resetiosflags &manip) {
289  try {
290  // this may throw, and we cannot afford it if the stream is used in a catch block
291  if ( s.isActive() ) s.stream() << manip;
292  } catch (...) {}
293  return s;
294 }
295 inline MsgStream& operator << (MsgStream& s,
296  const std::_Setbase &manip) {
297  try {
298  // this may throw, and we cannot afford it if the stream is used in a catch block
299  if ( s.isActive() ) s.stream() << manip;
300  } catch (...) {}
301  return s;
302 }
303 inline MsgStream& operator << (MsgStream& s,
304  const std::_Setprecision &manip) {
305  try {
306  // this may throw, and we cannot afford it if the stream is used in a catch block
307  if ( s.isActive() ) s.stream() << manip;
308  } catch (...) {}
309  return s;
310 }
311 inline MsgStream& operator << (MsgStream& s,
312  const std::_Setw &manip) {
313  try {
314  // this may throw, and we cannot afford it if the stream is used in a catch block
315  if ( s.isActive() ) s.stream() << manip;
316  } catch (...) {}
317  return s;
318 }
319 #endif // not __APPLE__
320 #else // GCC, version << 3
321 template<class _Tm> inline
323 MsgStream& operator << (MsgStream& s, const std::smanip<_Tm>& manip) {
324  try {
325  // this may throw, and we cannot afford it if the stream is used in a catch block
326  if ( s.isActive() ) s.stream() << manip;
327  } catch (...) {}
328  return s;
329 }
330 #endif // WIN32 or (__GNUC__)
331 
332 namespace MSG {
333  inline
335  log << std::dec;
336  return log;
337  }
338  inline
340  log << std::hex;
341  return log;
342  }
343 }
344 
347 inline MsgStream& operator<< (MsgStream& s, const char *arg){
348  try {
349  // this may throw, and we cannot afford it if the stream is used in a catch block
350  if ( s.isActive() ) s.stream() << arg;
351  } catch (...) {}
352  return s;
353 }
354 
356 template <typename T>
357 MsgStream& operator<< (MsgStream& lhs, const T& arg) {
358  using namespace GaudiUtils;
359  if(lhs.isActive())
360  try {
361  // this may throw, and we cannot afford it if the stream is used in a catch block
362  lhs.stream() << arg;
363  }
364  catch (...) {}
365  return lhs;
366 }
367 
368 #if defined(__GNUC__) and not defined(__APPLE__)
369 template<typename T>
371 MsgStream& operator << (MsgStream& lhs, const std::_Setfill<T> &manip) {
372  if ( lhs.isActive() )
373  try {
374  // this may throw, and we cannot afford it if the stream is used in a catch block
375  lhs.stream() << manip;
376  } catch(...) {}
377  return lhs;
378 }
379 #endif
380 
381 #endif // GAUDIKERNEL_MSGSTREAM_H
std::ostringstream & stream()
Access string MsgStream.
Definition: MsgStream.h:98
T setf(T...args)
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
MsgStream & operator<<(longlong arg)
Definition: MsgStream.h:160
const std::string & buffer() const
Access string buffer.
Definition: MsgStream.h:94
MSG::Level currentLevel()
Retrieve current stream output level.
Definition: MsgStream.h:116
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:119
int width(int v)
Definition: MsgStream.h:189
bool m_useColors
use colors
Definition: MsgStream.h:47
char fill() const
Definition: MsgStream.h:192
GAUDI_API void resetColor()
Reset the colors to defaults.
Definition: MsgStream.cpp:108
int rdstate() const
Definition: MsgStream.h:204
int precision() const
Definition: MsgStream.h:198
int precision(int v)
Definition: MsgStream.h:201
MSG::Level level()
Retrieve output level.
Definition: MsgStream.h:112
static bool m_countInactive
Flag to state if the inactive messages has to be counted.
Definition: MsgStream.h:52
T good(T...args)
int eof() const
Definition: MsgStream.h:210
int bad() const
Definition: MsgStream.h:213
MsgStream & dec(MsgStream &log)
Definition: MsgStream.h:334
bool isActive() const
Accessor: is MsgStream active.
Definition: MsgStream.h:128
IMessageSvc * m_service
Pointer to message service if buffer has send.
Definition: MsgStream.h:33
T precision(T...args)
T rdstate(T...args)
MsgStream & write(const char *buff, int len)
Definition: MsgStream.h:137
virtual void incrInactiveCount(MSG::Level level, const std::string &src)=0
Increment deactivated message count.
MsgStream & report(int lvl)
Initialize report of new message: activate if print level is sufficient.
Definition: MsgStream.h:76
MsgStream & hex(MsgStream &log)
Definition: MsgStream.h:339
virtual GAUDI_API MsgStream & doOutput()
Output method.
Definition: MsgStream.cpp:64
std::string m_source
Use std::string for source information to be passed to the message service.
Definition: MsgStream.h:37
Provide serialization function (output only) for some common STL classes (vectors, lists, pairs, maps) plus GaudiUtils::Map and GaudiUtils::HashMap.
STL class.
MSG::Level m_level
Debug level of the message service.
Definition: MsgStream.h:43
GAUDI_API void setColor(MSG::Color col)
Set the text color.
Definition: MsgStream.cpp:81
std::ios_base::iostate STATE_TYPE
Definition: MsgStream.h:30
int good() const
Definition: MsgStream.h:207
MsgStream & operator<<(MsgStream &(*_f)(MsgStream &))
Accept MsgStream modifiers.
Definition: MsgStream.h:142
T flags(T...args)
MsgStream & operator<<(std::ios_base &(*_f)(std::ios_base &))
Accept ios base class modifiers.
Definition: MsgStream.h:171
long setf(FLAG_TYPE _f, FLAG_TYPE _m)
Definition: MsgStream.h:216
MsgStream & operator<<(std::ios &(*_f)(std::ios &))
Accept ios modifiers.
Definition: MsgStream.h:152
void clear(STATE_TYPE _i=std::ios_base::failbit)
Definition: MsgStream.h:222
void deactivate()
Deactivate MsgStream.
Definition: MsgStream.h:124
MsgStream & flush()
Definition: MsgStream.h:132
std::ostringstream m_stream
String MsgStream associated to buffer.
Definition: MsgStream.h:39
The IMessage is the interface implemented by the message service.
Definition: IMessageSvc.h:57
T width(T...args)
char fill(char v)
Definition: MsgStream.h:195
T clear(T...args)
void setMsgSvc(IMessageSvc *svc)
Update IMessageSvc pointer.
Definition: MsgStream.h:102
bool m_active
Flag set to true if formatting engine is active.
Definition: MsgStream.h:41
T flush(T...args)
std::string m_buffer
Use standard string for information buffering.
Definition: MsgStream.h:35
MSG::Level m_currLevel
Current debug level.
Definition: MsgStream.h:45
GAUDI_API MsgStream(IMessageSvc *svc, int buffer_length=128)
Standard constructor: Connect to message service for output.
Definition: MsgStream.cpp:43
long flags() const
IOS emulation.
Definition: MsgStream.h:177
T write(T...args)
Print levels enumeration.
Definition: IMessageSvc.h:14
int width() const
Definition: MsgStream.h:186
Forward declarations for the functions in SerializeSTL.h.
Definition: GaudiHistoID.h:139
void setLevel(int level)
Update outputlevel.
Definition: MsgStream.h:106
string s
Definition: gaudirun.py:245
T dec(T...args)
MsgStream & operator<<(std::ostream &(*_f)(std::ostream &))
Accept oMsgStream modifiers.
Definition: MsgStream.h:147
T unsetf(T...args)
T fill(T...args)
void activate()
Activate MsgStream.
Definition: MsgStream.h:120
MsgStream(const MsgStream &msg)
Copy constructor.
Definition: MsgStream.h:60
IInactiveMessageCounter * m_inactCounter
Pointer to service counting messages prepared but not printed because of wrong level.
Definition: MsgStream.h:50
long flags(FLAG_TYPE v)
Definition: MsgStream.h:180
std::ios_base::fmtflags FLAG_TYPE
Error return code in case ios modification is requested for inactive streams.
Definition: MsgStream.h:29
long setf(FLAG_TYPE v)
Definition: MsgStream.h:183
#define GAUDI_API
Definition: Kernel.h:107
STL class.
STL class.
static GAUDI_API bool enableCountInactive(bool value=true)
Enable/disable the count of inactive messages.
Definition: MsgStream.cpp:32
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
virtual GAUDI_API ~MsgStream()=default
Standard destructor.
static GAUDI_API bool countInactive()
Returns the state of the counting of inactive messages (enabled/disabled).
Definition: MsgStream.cpp:38
void unsetf(FLAG_TYPE _l)
Definition: MsgStream.h:219