diff options
author | Yann Herklotz <ymherklotz@gmail.com> | 2017-11-02 18:46:49 +0000 |
---|---|---|
committer | Yann Herklotz <ymherklotz@gmail.com> | 2017-11-02 18:46:49 +0000 |
commit | 5fb7c972d44a3ce0a067101885d2e0c1966e7c89 (patch) | |
tree | a65d6a67ab1a2728223dbb9cebcf156670e3e64b /yage/core | |
parent | 2817eb3841960562d18cee18912cef1bbdb406f1 (diff) | |
download | YAGE-5fb7c972d44a3ce0a067101885d2e0c1966e7c89.tar.gz YAGE-5fb7c972d44a3ce0a067101885d2e0c1966e7c89.zip |
Adding logsink
Diffstat (limited to 'yage/core')
-rw-r--r-- | yage/core/logger.cpp | 9 | ||||
-rw-r--r-- | yage/core/logger.h | 4 | ||||
-rw-r--r-- | yage/core/logmessage.cpp | 5 | ||||
-rw-r--r-- | yage/core/logsink.cpp | 19 | ||||
-rw-r--r-- | yage/core/logsink.h | 57 |
5 files changed, 86 insertions, 8 deletions
diff --git a/yage/core/logger.cpp b/yage/core/logger.cpp index f64b908b..d289c0e6 100644 --- a/yage/core/logger.cpp +++ b/yage/core/logger.cpp @@ -11,8 +11,6 @@ #include <iostream> #include <string> -using namespace std; - namespace yage { @@ -21,9 +19,12 @@ LogMessage Logger::operator()() return LogMessage(this); } -void Logger::flush(const LogMessage &msg) +void Logger::flush(const LogMessage *msg) { - string asString(msg.buffer_.str()); + using std::string; + using std::cout; + + string asString(msg->buffer_.str()); cout << asString << "\n"; } diff --git a/yage/core/logger.h b/yage/core/logger.h index e7187a81..6829327e 100644 --- a/yage/core/logger.h +++ b/yage/core/logger.h @@ -19,11 +19,13 @@ class Logger public: LogMessage operator()(); - void flush(const LogMessage &msg); + void flush(const LogMessage *msg); static Logger &instance(); }; } // namespace yage +#define gLog yage::Logger::instance()() + #endif diff --git a/yage/core/logmessage.cpp b/yage/core/logmessage.cpp index aa512042..82b63d2e 100644 --- a/yage/core/logmessage.cpp +++ b/yage/core/logmessage.cpp @@ -9,6 +9,9 @@ #include "logmessage.h" #include "logger.h" + +#include <iostream> + namespace yage { @@ -19,7 +22,7 @@ LogMessage::LogMessage(LogMessage &&msg) : owner_(std::move(msg.owner_)) {} LogMessage::~LogMessage() { if (owner_ != nullptr) { - owner_->flush(*this); + owner_->flush(this); } } diff --git a/yage/core/logsink.cpp b/yage/core/logsink.cpp new file mode 100644 index 00000000..1cc8b139 --- /dev/null +++ b/yage/core/logsink.cpp @@ -0,0 +1,19 @@ +/* ---------------------------------------------------------------------------- + * logsink.cpp + * + * Copyright (c) 2017 Yann Herklotz Grave <ymherklotz@gmail.com> -- MIT License + * See file LICENSE for more details + * ---------------------------------------------------------------------------- + */ + +#include "logsink.h" + +namespace yage +{ + +void LogSink::write(const LogMessage::Meta &meta, const std::string &msg) +{ + wrapper_->write(meta, msg); +} + +} // namespace yage 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 |