diff options
Diffstat (limited to 'yage/core/logsink.h')
-rw-r--r-- | yage/core/logsink.h | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/yage/core/logsink.h b/yage/core/logsink.h index bdfc70cf..e898d15f 100644 --- a/yage/core/logsink.h +++ b/yage/core/logsink.h @@ -1,5 +1,5 @@ /* ---------------------------------------------------------------------------- - * logger.cpp + * logsink.h * * Copyright (c) 2017 Yann Herklotz Grave <ymherklotz@gmail.com> -- MIT License * See file LICENSE for more details @@ -11,6 +11,7 @@ #include "logmessage.h" +#include <memory> #include <string> namespace yage @@ -19,9 +20,61 @@ namespace yage class LogSink { public: - void operator()(const LogMessage::Meta &, const std::string &message); + template <typename T> + LogSink(T impl); + + void write(const LogMessage::Meta &meta, const std::string &msg); + +private: + struct Concept { + virtual ~Concept() = default; + + virtual Concept *clone() const = 0; + virtual void write(const LogMessage::Meta &meta, + const std::string &msg) = 0; + }; + + template <typename T> + struct Model : Concept { + Model(T impl_i); + virtual Concept *clone() const override; + virtual void write(const LogMessage::Meta &meta, + const std::string &msg) override; + + T impl; + }; + + std::unique_ptr<Concept> wrapper_; }; +/* ----------------------------------------------------------------------------- + * Template Implementation + * ----------------------------------------------------------------------------- + */ + +template <typename T> +LogSink::LogSink(T impl) : wrapper_(new Model<T>(std::move(impl))) +{ +} + +template <typename T> +LogSink::Model<T>::Model(T impl_i) : impl(impl_i) +{ +} + +template <typename T> +LogSink::Concept *LogSink::Model<T>::clone() const +{ + return new Model<T>(impl); +} + +template <typename T> +void LogSink::Model<T>::write(const LogMessage::Meta &meta, + const std::string &msg) +{ + impl(meta, msg); +} + } // namespace yage #endif |