From 2147feaafcba1767015d9832401913469d5dc0b4 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Tue, 31 Aug 2021 14:31:09 +0200 Subject: [PATCH] [WIP] Fix stuff to get the VIVY_NEW_LOG_SINK macro working --- src/Lib/Log.cc | 22 +++++++++++++++++++++- src/Lib/Log.hh | 29 ++++++++++++++++++++--------- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/Lib/Log.cc b/src/Lib/Log.cc index ae989823..7942c1d5 100644 --- a/src/Lib/Log.cc +++ b/src/Lib/Log.cc @@ -2,12 +2,32 @@ using namespace Vivy; +LogSink::~LogSink() noexcept {} + LogMessage::~LogMessage() noexcept { parentLogger->sendLogMessage(*this); } -Logger::~Logger() noexcept { parentLogSink->closeLoggerClient(this); } + +std::shared_ptr<LogSink> +LogSink::newSink() noexcept +{ + struct makeSharedEnabler : public LogSink { + // NOTE: For make_shared with private CTor + }; + return std::make_shared<makeSharedEnabler>(); +} void LogSink::closeLoggerClient(Logger *const logger) noexcept { + clientLoggers.erase(std::remove_if(std::begin(clientLoggers), std::end(clientLoggers), + [logger](const std::shared_ptr<Logger> &ptr) { + return ptr.get() == logger; + })); +} + +void +LogSink::closeLoggerClient(const std::shared_ptr<Logger> &ptr) noexcept +{ + closeLoggerClient(ptr.get()); } LogMessage diff --git a/src/Lib/Log.hh b/src/Lib/Log.hh index fa109ff7..97f0697a 100644 --- a/src/Lib/Log.hh +++ b/src/Lib/Log.hh @@ -5,13 +5,15 @@ #define VIVY_NEW_LOG_SINK() LogSink::newSink() #define VIVY_GET_LOGGER(sink, cat) sink->createClient(cat) -#define VIVY_LOG_WITH_LEVEL(log, level) log->logEvent(__FILE__, __function__, __LINE__, level) +#define VIVY_LOG_WITH_LEVEL(log, level) log->logEvent(__FILE__, __func__, __LINE__, level) #define VIVY_LOG_WARN(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Warning) #define VIVY_LOG_DEBUG(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Debug) #define VIVY_LOG_INFO(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Info) #define VIVY_LOG_ERR(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Error) #define VIVY_LOG_FATAL(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Critical) +#define VIVY_DCL_LOG_SINK(sink) std::shared_ptr<LogSink> sink{ VIVY_NEW_LOG_SINK() }; + #define VIVY_LOGGABLE_OBJECT(sink, name, logger) \ std::shared_ptr<Logger> logger = VIVY_GET_LOGGER(sink, name); \ LogMessage logFatal() const noexcept { return VIVY_LOG_FATAL(logger); } \ @@ -35,7 +37,8 @@ enum class LogLevel : int { Error = 4, Warning = 3, Info = 2, - Debug = 1 + Debug = 1, + None = std::numeric_limits<int>::min() // In option setup to disable logs }; // Message to be logged, constructed by a logger then send @@ -71,10 +74,9 @@ public: // A logger class, a client to LogSink. Will generate and send instances of // LogMessage. -class Logger final { +class Logger { VIVY_UNMOVABLE_OBJECT(Logger) friend class LogSink; - friend class std::shared_ptr<Logger>; LogSink *const parentLogSink; const std::string logCategory; @@ -97,9 +99,17 @@ class Logger final { { } -public: - ~Logger() noexcept; + // Shortcut because of std::make_shared + static std::shared_ptr<Logger> createAndAttachClient(LogSink *const sink, + StringType auto const &category) noexcept + { + struct makeSharedEnabler : public Logger { + // NOTE: For make_shared with private CTor + }; + return std::make_shared<makeSharedEnabler>(sink, category); + } +public: void sendLogMessage(const LogMessage &) const noexcept; LogMessage logEvent(const char *fileName, const char *functionName, const int lineNumber, const LogLevel) noexcept; @@ -107,19 +117,20 @@ public: // LogSink is the parent logger. It will recieve messages and display them to a // console or to std::cerr or to a file, etc. -class LogSink final { +class LogSink { VIVY_UNMOVABLE_OBJECT(LogSink) - LogSink() noexcept; + LogSink() noexcept = default; public: static std::shared_ptr<LogSink> newSink() noexcept; ~LogSink() noexcept; void closeLoggerClient(Logger *const) noexcept; + void closeLoggerClient(const std::shared_ptr<Logger> &) noexcept; std::shared_ptr<Logger> createClient(StringType auto const &category) noexcept { - auto ret = std::make_shared<Logger>(this, category); + auto ret = Logger::createAndAttachClient(this, category); clientLoggers.push_back(ret); return ret; } -- GitLab