#pragma once // MassBuilderSaveTool // Copyright (C) 2021-2022 Guillaume Jacquemin // // 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 . #include #include #ifndef SAVETOOL_DEBUG_BUILD #include #endif #include #include #include #include #include "EntryType.h" using namespace Corrade; using Containers::ArrayView; using Containers::String; using Containers::StringView; using namespace Magnum; using namespace Containers::Literals; class Logger { public: Logger(const Logger&) = delete; Logger& operator=(const Logger&) = delete; Logger(Logger&&) = delete; Logger& operator=(Logger&&) = delete; static auto instance() -> Logger&; void initialise(); void indent(); void unindent(); void log(EntryType type, StringView location, StringView message); void lockMutex(); void unlockMutex(); private: Logger() = default; #ifndef SAVETOOL_DEBUG_BUILD std::ofstream _logFile; #endif UnsignedInt _indentLevel = 0; std::mutex _logMutex{}; }; auto logger() -> Logger&; #define LOG(entry_type, message) logger().lockMutex(); \ logger().log(EntryType::entry_type, \ Utility::format("{}:{}", StringView{__builtin_FILE()}.find("src"_s).data() + 4, __builtin_LINE()), \ message); \ logger().unlockMutex() #define LOG_INFO(message) LOG(Info, message) #define LOG_WARNING(message) LOG(Warning, message) #define LOG_ERROR(message) LOG(Error, message) #define LOG_INFO_FORMAT(message, ...) LOG_INFO(Utility::format(message, __VA_ARGS__)) #define LOG_WARNING_FORMAT(message, ...) LOG_WARNING(Utility::format(message, __VA_ARGS__)) #define LOG_ERROR_FORMAT(message, ...) LOG_ERROR(Utility::format(message, __VA_ARGS__))