aboutsummaryrefslogtreecommitdiffstats
path: root/yage/core/logsink.h
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-11-02 18:46:49 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-11-02 18:46:49 +0000
commit5fb7c972d44a3ce0a067101885d2e0c1966e7c89 (patch)
treea65d6a67ab1a2728223dbb9cebcf156670e3e64b /yage/core/logsink.h
parent2817eb3841960562d18cee18912cef1bbdb406f1 (diff)
downloadYAGE-5fb7c972d44a3ce0a067101885d2e0c1966e7c89.tar.gz
YAGE-5fb7c972d44a3ce0a067101885d2e0c1966e7c89.zip
Adding logsink
Diffstat (limited to 'yage/core/logsink.h')
-rw-r--r--yage/core/logsink.h57
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