diff --git a/src/Lib/Log.hh b/src/Lib/Log.hh index b40bac3aaddc8b4b5c13ae729cd0456c709d9f3c..805f857b2420e6f293312b00a1d3b28eaa8e7e9f 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; }