#ifndef _LOGGER_H_ #define _LOGGER_H_ #include "log_queue.h" #include #include #include #include #include class logger { private: std::atomic _enabled; std::stringstream _logLine; log_queue _queue; public: logger(); void set_enabled(bool enabled) { _enabled = enabled; } template void log(const char* s, const Args&... args) { if(_enabled) { _queue.add_log([this, s, &args...] { _logLine.str(""); log_internal(s, args...); }); } } private: void log_internal(const char* s); template void log_internal(const char* s, const T& value, const Args&... args) { while (*s) { if (*s == '%' && *++s != '%') { _logLine << value; return log_internal(s, args...); } _logLine << *s++; } throw std::runtime_error("extra arguments provided"); } }; extern logger ulog; #endif // _LOGGER_H_