1 #ifndef MHO_Message_HH__
2 #define MHO_Message_HH__
22 #define STRING(str) STR(str)
24 #ifdef HOPS_ENABLE_DEV_TODO
25 #if defined(__clang__)
26 #define DO_PRAGMA(x) _Pragma(#x)
27 #define TODO_FIXME_MSG(x) DO_PRAGMA(message #x)
28 #elif defined(__GNUC__)
29 #define DO_PRAGMA(x) _Pragma(#x)
30 #define TODO_FIXME_MSG(x) DO_PRAGMA(message #x)
32 #error Unsupported compiler
35 #define TODO_FIXME_MSG(x)
49 namespace sn = selfname;
117 if(fInstance ==
nullptr)
125 void Lock() { fMutex.lock(); };
138 void AddKey(
const std::string& key);
139 void AddKey(
const char* key);
188 : fTerminalStream(&std::cout), fAllowedLevel(eStatus), fCurrentLevel(eInfo), fCurrentKeyIsAllowed(false),
189 fAcceptAllKeys(false), fWasLastLineNewLine(false){};
190 virtual ~MHO_Message(){};
193 std::string GetCurrentPrefix(
const MHO_MessageLevel& level,
const std::string& key);
198 std::ostream* fTerminalStream;
199 std::set< std::string > fKeys;
203 bool fCurrentKeyIsAllowed;
205 std::stringstream fMessageStream;
207 static std::string fRed;
208 static std::string fYellow;
209 static std::string fOrange;
210 static std::string fBlue;
211 static std::string fGreen;
212 static std::string fCyan;
213 static std::string fWhite;
214 static std::string fColorSuffix;
216 bool fWasLastLineNewLine;
223 fMessageStream << item;
232 #ifndef HOPS_EXTRA_VERBOSE_MSG
234 #define msg_fatal(xKEY, xCONTENT) \
237 MHO_Message::GetInstance().Lock(); \
238 MHO_Message::GetInstance().SendMessage(eFatal, xKEY) << xCONTENT; \
239 MHO_Message::GetInstance().Unlock(); \
244 #define msg_error(xKEY, xCONTENT) \
247 MHO_Message::GetInstance().Lock(); \
248 MHO_Message::GetInstance().SendMessage(eError, xKEY) << xCONTENT; \
249 MHO_Message::GetInstance().Unlock(); \
254 #define msg_warn(xKEY, xCONTENT) \
257 MHO_Message::GetInstance().Lock(); \
258 MHO_Message::GetInstance().SendMessage(eWarning, xKEY) << xCONTENT; \
259 MHO_Message::GetInstance().Unlock(); \
264 #define msg_status(xKEY, xCONTENT) \
267 MHO_Message::GetInstance().Lock(); \
268 MHO_Message::GetInstance().SendMessage(eStatus, xKEY) << xCONTENT; \
269 MHO_Message::GetInstance().Unlock(); \
274 #define msg_info(xKEY, xCONTENT) \
277 MHO_Message::GetInstance().Lock(); \
278 MHO_Message::GetInstance().SendMessage(eInfo, xKEY) << xCONTENT; \
279 MHO_Message::GetInstance().Unlock(); \
284 #ifdef HOPS_ENABLE_DEBUG_MSG
287 #define msg_debug(xKEY, xCONTENT) \
290 MHO_Message::GetInstance().Lock(); \
291 MHO_Message::GetInstance().SendMessage(eDebug, xKEY) << xCONTENT; \
292 MHO_Message::GetInstance().Unlock(); \
297 #define msg_debug(xKEY, xCONTENT)
302 #define msg_fatal(xKEY, xCONTENT) \
305 MHO_Message::GetInstance().Lock(); \
306 MHO_Message::GetInstance().SendMessage(eFatal, xKEY) \
307 << "(" << sn::file_basename(__FILE__) << ":" << __LINE__ << ") " << xCONTENT; \
308 MHO_Message::GetInstance().Unlock(); \
313 #define msg_error(xKEY, xCONTENT) \
316 MHO_Message::GetInstance().Lock(); \
317 MHO_Message::GetInstance().SendMessage(eError, xKEY) \
318 << "(" << sn::file_basename(__FILE__) << ":" << __LINE__ << ") " << xCONTENT; \
319 MHO_Message::GetInstance().Unlock(); \
324 #define msg_warn(xKEY, xCONTENT) \
327 MHO_Message::GetInstance().Lock(); \
328 MHO_Message::GetInstance().SendMessage(eWarning, xKEY) \
329 << "(" << sn::file_basename(__FILE__) << ":" << __LINE__ << ") " << xCONTENT; \
330 MHO_Message::GetInstance().Unlock(); \
335 #define msg_status(xKEY, xCONTENT) \
338 MHO_Message::GetInstance().Lock(); \
339 MHO_Message::GetInstance().SendMessage(eStatus, xKEY) \
340 << "(" << sn::file_basename(__FILE__) << ":" << __LINE__ << ") " << xCONTENT; \
341 MHO_Message::GetInstance().Unlock(); \
346 #define msg_info(xKEY, xCONTENT) \
349 MHO_Message::GetInstance().Lock(); \
350 MHO_Message::GetInstance().SendMessage(eInfo, xKEY) \
351 << "(" << sn::file_basename(__FILE__) << ":" << __LINE__ << ") " << xCONTENT; \
352 MHO_Message::GetInstance().Unlock(); \
357 #ifdef HOPS_ENABLE_DEBUG_MSG
360 #define msg_debug(xKEY, xCONTENT) \
363 MHO_Message::GetInstance().Lock(); \
364 MHO_Message::GetInstance().SendMessage(eDebug, xKEY) \
365 << "(" << sn::file_basename(__FILE__) << ":" << __LINE__ << ") " << xCONTENT; \
366 MHO_Message::GetInstance().Unlock(); \
371 #define msg_debug(xKEY, xCONTENT)
376 #ifdef HOPS_ENABLE_STEPWISE_CHECK
378 #define check_step_error(xVALUE, xKEY, xCONTENT) \
381 MHO_Message::GetInstance().SendMessage(eError, xKEY) << xCONTENT; \
383 #define check_step_fatal(xVALUE, xKEY, xCONTENT) \
386 MHO_Message::GetInstance().SendMessage(eFatal, xKEY) << xCONTENT; \
387 HOPS_ASSERT_THROW(xVALUE); \
391 #define check_step_error(xVALUE, xKEY, xCONTENT)
392 #define check_step_fatal(xVALUE, xKEY, xCONTENT)
constexpr to strip path prefix from FILE macros
uses the singleton pattern (as we only have one terminal)
Definition: MHO_Message.hh:100
MHO_Message(MHO_Message const &)=delete
Deleted copy constructor (singleton).
MHO_Message & SendMessage(const MHO_MessageLevel &level, const std::string &key)
Begin a new message with a specific level and key.
Definition: MHO_Message.cc:66
void SetLegacyMessageLevel(int legacy_message_level)
Set the message level using a legacy integer interface.
Definition: MHO_Message.cc:206
MHO_Message & operator=(MHO_Message const &)=delete
Deleted copy assignment operator (singleton).
void AcceptAllKeys()
Allow all message keys (no category/library filtering).
Definition: MHO_Message.hh:131
void LimitToKeySet()
Restrict messages to a defined key set.
Definition: MHO_Message.hh:134
void RemoveAllKeys()
Remove all message keys (disables all filtering).
Definition: MHO_Message.cc:50
void SetMessageLevel(MHO_MessageLevel level)
Set the allowed message level threshold.
Definition: MHO_Message.hh:154
void RemoveKey(const std::string &key)
Remove a message key from the allowed key set.
Definition: MHO_Message.cc:31
MHO_Message(MHO_Message &&)=delete
Deleted move constructor (singleton).
MHO_Message & operator<<(const XStreamableItemType &item)
Stream an item into the current message.
Definition: MHO_Message.hh:219
void Flush()
Flush the current output stream buffer.
Definition: MHO_Message.cc:55
void Lock()
Lock the message handler for thread-safe operations.
Definition: MHO_Message.hh:125
void AddKey(const std::string &key)
Add a message key to the allowed key set.
Definition: MHO_Message.cc:21
void Unlock()
Unlock the message handler.
Definition: MHO_Message.hh:128
MHO_Message & operator=(MHO_Message &&)=delete
Deleted move assignment operator (singleton).
MHO_MessageLevel GetMessageLevel() const
Get the currently configured message level threshold.
Definition: MHO_Message.hh:162
static MHO_Message & GetInstance()
Access the singleton instance of the message handler.
Definition: MHO_Message.hh:115
Definition: MHO_ChannelLabeler.hh:17
MHO_MessageLevel
Definition: MHO_Message.hh:68
@ eStatusLevel
use to inform about unexpected state which may lead to errors
Definition: MHO_Message.hh:74
@ eDebugLevel
extra information to inform about configuration/state of program
Definition: MHO_Message.hh:76
@ eWarningLevel
use for non-fatal errors which may lead to unexpected behavior
Definition: MHO_Message.hh:73
@ eSpecialLevel
Definition: MHO_Message.hh:69
@ eErrorLevel
use for fatal errors (program termination imminent)
Definition: MHO_Message.hh:72
@ eInfoLevel
information about the current execution status of the program
Definition: MHO_Message.hh:75
@ eFatalErrorLevel
mute all messages entirely, including fatal ones
Definition: MHO_Message.hh:71
@ eSilentErrorLevel
special print level
Definition: MHO_Message.hh:70
Class MHO_MessageEndline.
Definition: MHO_Message.hh:61
Class MHO_MessageNewline.
Definition: MHO_Message.hh:55