00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef LIBPLUMBING_LOGGING_H
00019 #define LIBPLUMBING_LOGGING_H
00020
00021 #include <cstdarg>
00022
00023 #include <libplumbing/format_printf.h>
00024
00025 namespace plumbing {
00026
00043 class logging
00044 {
00045 public:
00049 virtual ~logging();
00050
00051 protected:
00059 logging();
00060
00061 public:
00071 void warning(const char *fmt, ...) FORMAT_PRINTF(2, 3);
00072
00083 void warning_v(const char *fmt, va_list ap) FORMAT_PRINTF(2, 0);
00084
00095 void fatal_error(const char *fmt, ...) NORETURN FORMAT_PRINTF(2, 3);
00096
00108 void fatal_error_v(const char *fmt, va_list ap)
00109 NORETURN FORMAT_PRINTF(2, 0);
00115 static logging &get_singleton();
00116
00121 static void register_stream(logging *ls);
00122
00131 void message(const char *fmt, ...) FORMAT_PRINTF(2, 3);
00132
00143 void message_v(const char *fmt, va_list ap) FORMAT_PRINTF(2, 0);
00144
00145 protected:
00151 virtual void deliver_message_text(const char *txt) = 0;
00152
00160 void exit() NORETURN;
00161
00162 private:
00167 static logging *singleton;
00168
00172 logging(const logging &);
00173
00177 logging &operator=(const logging &);
00178
00179
00180
00181 friend class logging_tee;
00182 };
00183
00197 inline logging &log() { return logging::get_singleton(); }
00198
00199 }
00200
00201 #endif // LIBPLUMBING_LOGGING_H
00202