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