From 0a4a83cacd1ea3eaa6c0130d0ec4de8bde8cb458 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Wed, 1 Sep 2021 14:55:36 +0200 Subject: [PATCH] LOG: The newDispatch creation for a sink now supports constructors with arguments --- src/Lib/Log.hh | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Lib/Log.hh b/src/Lib/Log.hh index b40bac3a..805f857b 100644 --- a/src/Lib/Log.hh +++ b/src/Lib/Log.hh @@ -2,7 +2,10 @@ #include "Utils.hh" -#define VIVY_GET_LOGGER(sink, cat) std::make_shared<Logger>(sink.get(), cat) +// Create a logger with a category +#define VIVY_GET_LOGGER(sink, cat) std::make_shared<Logger>(sink.get(), cat) + +// Log something in a logger #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) @@ -10,13 +13,21 @@ #define VIVY_LOG_ERR(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Error) #define VIVY_LOG_FATAL(log) VIVY_LOG_WITH_LEVEL(log, LogLevel::Critical) +// Declare a sink, with the utility function/method `flushLogSink`. This is +// intended to be used in an object to not polluate namespaces. #define VIVY_DCL_LOG_SINK(sink) \ std::shared_ptr<LogSink> sink{ LogSink::newSink() }; \ void flushLogSink() const noexcept { sink->flush(); } +// Declare a dispatch for a sink with no arguments in the constructor. #define VIVY_DCL_LOG_DISPATCH(sink, name, dispatch) \ std::shared_ptr<dispatch> name{ sink->newDispatcher<dispatch>() }; +// Declare a dispatch for a sink with arguments in the constructor. +#define VIVY_DCL_LOG_DISPATCH_WITH(sink, name, dispatch, ...) \ + std::shared_ptr<dispatch> name{ sink->newDispatcher<dispatch>(__VA_ARGS__) }; + +// Install logger for the object. #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); } \ @@ -90,10 +101,11 @@ public: void recieveLogMessage(const Logger *const, LogMessage &&) noexcept; void flush() noexcept; - template <Derived<LogSinkDispatcher> DispatcherType> - std::shared_ptr<DispatcherType> newDispatcher() noexcept + template <Derived<LogSinkDispatcher> DispatcherType, typename... Args> + std::shared_ptr<DispatcherType> newDispatcher(Args &&...args) noexcept { - std::shared_ptr<DispatcherType> dispatch = std::make_shared<DispatcherType>(); + std::shared_ptr<DispatcherType> dispatch = + std::make_shared<DispatcherType>(std::forward<Args>(args)...); registerLogDispatcher(dispatch); return dispatch; } -- GitLab