1 // Stuff related to ROSE diagnostics
2 #ifndef ROSE_Diagnostics_H
3 #define ROSE_Diagnostics_H
5 #include "Sawyer/Assert.h"
6 #include "Sawyer/Message.h"
8 // How failed assertions behave
9 #define ROSE_ASSERTION_ABORT 1 // call abort()
10 #define ROSE_ASSERTION_EXIT 2 // call exit(1)
11 #define ROSE_ASSERTION_THROW 3 // throw Rose::Diagnostics::FailedAssertion
13 namespace Rose {
290 namespace Diagnostics {
292 // Make Sawyer message importance levels available here. That way, we don't have to "use namespace Sawyer::Message", which
293 // also sucks in a lot of other stuff.
294 using Sawyer::Message::DEBUG; // very low-level debugging mostly for developers
295 using Sawyer::Message::TRACE; // more low-level debugging but maybe more interesting to users
296 using Sawyer::Message::WHERE; // higher-level debugging to help users understand ROSE flow
297 using Sawyer::Message::MARCH; // progress bars and other high-frequency messages
298 using Sawyer::Message::INFO; // useful information about normal behavior such as stats
299 using Sawyer::Message::WARN; // warnings that users should almost certainly see at least once
300 using Sawyer::Message::ERROR; // recoverable errors, possibly followed by throw
301 using Sawyer::Message::FATAL; // errors which are immediately followed by exit, abort, or similar
303 using Sawyer::Message::Stream; // one message stream, e.g., 'mlog[INFO]'
304 using Sawyer::Message::Facility; // collection of related streams, e.g., 'mlog'
309 ROSE_DLL_API extern Sawyer::Message::DestinationPtr destination;
314 ROSE_DLL_API extern Sawyer::Message::PrefixPtr mprefix;
317 ROSE_DLL_API extern Sawyer::Message::Facility mlog;
325 ROSE_DLL_API void initialize();
328 ROSE_DLL_API bool isInitialized();
336 ROSE_DLL_API void initAndRegister(Facility *mlog, const std::string &name);
338 // [Robb P Matzke 2017-02-16]: deprecated: The version that takes a pointer first argument is a better design because it gives
339 // the user a better clue that we're saving a reference rather than a copy. Note: ROSE_DEPRECATED not defined here.
340 ROSE_DLL_API void initAndRegister(Facility &mlog, const std::string &name) SAWYER_DEPRECATED("use a pointer for the first argument");
349 ROSE_DLL_API void deregister(Facility *mlog);
358  std::ostream &stream;
359 public:
360  StreamPrintf(std::ostream &stream): stream(stream) {}
361 #ifdef _MSC_VER
362  int operator()(const char *fmt, ...);
363 #else
364  int operator()(const char *fmt, ...) __attribute__((format(printf, 2, 3)));
365 #endif
366 };
385 StreamPrintf mfprintf(std::ostream &stream);
387 // See mfprintf. "mlog" must be resolved at point where macro is expanded.
388 #define mprintf Rose::Diagnostics::mfprintf(mlog[Rose::Diagnostics::DEBUG])
390 } // namespace
391 } // namespace
393 #endif
Messages intended to be useful primarily to the author of the code.
Definition: Message.h:314
Collection of streams.
Definition: Message.h:1606
ROSE_DLL_API void deregister(Facility *mlog)
Deregister a facility.
ROSE_DLL_API Sawyer::Message::Facility mlog
Diagnostic facility for the ROSE library as a whole.
Error messages that indicate an abnormal situation from which the program was able to at least partia...
Definition: Message.h:330
ROSE_DLL_API Sawyer::Message::PrefixPtr mprefix
Default line prefix for message sinks created in ROSE.
Main namespace for the ROSE library.
ROSE_DLL_API void initAndRegister(Facility *mlog, const std::string &name)
Initialize and register a logging facility.
Messages that indicate an abnormal situation from which the program was unable to recover...
Definition: Message.h:332
Reference-counting intrusive smart pointer.
Definition: SharedPointer.h:68
ROSE_DLL_API void initialize()
Initialize diagnostics-related global variables.
Progress reports and other similar rapidly updating partial messages.
Definition: Message.h:325
Facilities mfacilities
Library-provided facility group.
ROSE_DLL_API bool isInitialized()
Returns true if diagnostics-related global variables have been initialized.
Warning messages that indicate an unusual situation from which the program was able to fully recover...
Definition: Message.h:328
Detailed tracing information useful to end-users that are trying to understand program internals...
Definition: Message.h:317
StreamPrintf mfprintf(std::ostream &stream)
Print to a C++ stream using a printf-like API.
Converts text to messages.
Definition: Message.h:1396
ROSE_DLL_API Sawyer::Message::DestinationPtr destination
Default destination for ROSE diagnostics.
Informative messages.
Definition: Message.h:326
Intermediate class for printing to C++ ostreams with a printf-like API.
Granular tracing information useful to end-users that are trying to understand program internals...
Definition: Message.h:322