/* Ousía Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _OUSIA_LOGGER_HPP_ #define _OUSIA_LOGGER_HPP_ #include #include #include namespace ousia { enum class Severity : int { DEBUG = 0, INFO = 1, WARNING = 2, ERROR = 3, FATAL_ERROR = 4 }; struct LogMessage { Severity severity; std::string msg; std::string file; int line; int column; LogMessage(Severity severity, std::string msg, std::string file, int line, int column) : severity(severity), msg(std::move(msg)), file(std::move(file)), line(line), column(column){}; }; class Logger { private: Severity maxLogSeverity = Severity::DEBUG; std::string curFile; protected: virtual void logMessage(const LogMessage &msg){}; public: Logger(){}; Logger(const Logger &) = delete; virtual ~Logger(); void log(Severity severity, const std::string &msg, const std::string &file, int line = -1, int column = -1) { // Copy the current severity level if (static_cast(severity) > static_cast(maxSeverity)) { maxSeverity = severity; } // Call the actual log message function logMessage(LogMessage{severity, msg, file, line, column}); } void log(Severity severity, const std::string &msg, int line = -1, int column = -1) { log(severity, msg, curFile, line, column); } void debug(const std::string &msg, int line = -1, int column = -1) { log(Severity::DEBUG, msg, line, column); } void info(const std::string &msg, int line = -1, int column = -1) { log(Severity::INFO, msg, line, column); } void warning(const std::string &msg, int line = -1, int column = -1) { log(Severity::WARNING, msg, line, column); } void error(const std::string &msg, int line = -1, int column = -1) { log(Severity::ERROR, msg, line, column); } void fatalError(const std::string &msg, int line = -1, int column = -1) { log(Severity::FATAL_ERROR, msg, line, column); } Severity getMaxSeverity() { return maxSeverity; } }; class StreamLogger { private: std::ostream &os; bool useColor; protected: void logMessage(const LogMessage &msg) override; public: StreamLogger(std::ostream &os, bool useColor = false) : os(os), useColor(useColor) { } }; } #endif /* _OUSIA_LOGGER_HPP_ */