/** --------------------------------------------------------------------------- * @file: logsink.h * * Copyright (c) 2017 Yann Herklotz Grave * MIT License, see LICENSE file for more details. * ---------------------------------------------------------------------------- */ /// @file #ifndef YAGE_CORE_LOGSINK_H #define YAGE_CORE_LOGSINK_H /// @todo remove the include to make compilation faster #include "logmessage.h" #include #include namespace yage { class LogSink { public: template LogSink(T impl); LogSink(const LogSink &sink); LogSink(LogSink &&sink); LogSink &operator=(const LogSink &sink); LogSink &operator=(LogSink &&sink); bool operator==(const LogSink &sink); void write(const LogMessage::Meta &meta, const std::string &msg) const; private: struct Concept { virtual ~Concept() = default; virtual Concept *clone() const = 0; virtual void write(const LogMessage::Meta &meta, const std::string &msg) const = 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) const override; T impl; }; std::unique_ptr wrapper_; }; LogSink makeConsoleSink(); LogSink makeFileSink(const std::string &filename); LogSink makeFileSink(std::string &&filename); /* ----------------------------------------------------------------------------- * 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) const { impl(meta, msg); } } // namespace yage #endif