aboutsummaryrefslogtreecommitdiffstats
path: root/yage/core
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
parent2817eb3841960562d18cee18912cef1bbdb406f1 (diff)
downloadYAGE-5fb7c972d44a3ce0a067101885d2e0c1966e7c89.tar.gz
YAGE-5fb7c972d44a3ce0a067101885d2e0c1966e7c89.zip
Adding logsink
Diffstat (limited to 'yage/core')
-rw-r--r--yage/core/logger.cpp9
-rw-r--r--yage/core/logger.h4
-rw-r--r--yage/core/logmessage.cpp5
-rw-r--r--yage/core/logsink.cpp19
-rw-r--r--yage/core/logsink.h57
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