#ifndef LOGGER_HH #define LOGGER_HH #include class Logger { public: virtual ~Logger() = default; static std::unique_ptr create_stdio(); static std::unique_ptr create_null(); virtual void err(char const* format, ...) #if HAVE_ATTRIBUTE_FORMAT __attribute__((format(printf, 2, 3))) // this takes up 1 #endif // HAVE_ATTRIBUTE_FORMAT = 0; virtual void warn(char const* format, ...) #if HAVE_ATTRIBUTE_FORMAT __attribute__((format(printf, 2, 3))) #endif // HAVE_ATTRIBUTE_FORMAT = 0; virtual void info(char const* format, ...) #if HAVE_ATTRIBUTE_FORMAT __attribute__((format(printf, 2, 3))) #endif // HAVE_ATTRIBUTE_FORMAT = 0; #ifdef NDEBUG void dbg(char const*, ...) #if HAVE_ATTRIBUTE_FORMAT __attribute__((format(printf, 2, 3))) #endif // HAVE_ATTRIBUTE_FORMAT {} #else virtual void dbg(char const* format, ...) #if HAVE_ATTRIBUTE_FORMAT __attribute__((format(printf, 2, 3))) #endif // HAVE_ATTRIBUTE_FORMAT = 0; #endif protected: Logger() = default; Logger(Logger const&) = delete; Logger& operator=(Logger const&) = delete; }; #endif // LOGGER_HH