From 5fb7c972d44a3ce0a067101885d2e0c1966e7c89 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Thu, 2 Nov 2017 18:46:49 +0000 Subject: Adding logsink --- yage/core/logsink.h | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) (limited to 'yage/core/logsink.h') 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 -- MIT License * See file LICENSE for more details @@ -11,6 +11,7 @@ #include "logmessage.h" +#include #include namespace yage @@ -19,9 +20,61 @@ namespace yage class LogSink { public: - void operator()(const LogMessage::Meta &, const std::string &message); + template + 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 + 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 wrapper_; }; +/* ----------------------------------------------------------------------------- + * Template Implementation + * ----------------------------------------------------------------------------- + */ + +template +LogSink::LogSink(T impl) : wrapper_(new Model(std::move(impl))) +{ +} + +template +LogSink::Model::Model(T impl_i) : impl(impl_i) +{ +} + +template +LogSink::Concept *LogSink::Model::clone() const +{ + return new Model(impl); +} + +template +void LogSink::Model::write(const LogMessage::Meta &meta, + const std::string &msg) +{ + impl(meta, msg); +} + } // namespace yage #endif -- cgit