aboutsummaryrefslogtreecommitdiffstats
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
parent2817eb3841960562d18cee18912cef1bbdb406f1 (diff)
downloadYAGE-5fb7c972d44a3ce0a067101885d2e0c1966e7c89.tar.gz
YAGE-5fb7c972d44a3ce0a067101885d2e0c1966e7c89.zip
Adding logsink
-rw-r--r--CMakeLists.txt1
-rw-r--r--tests/logtest.cpp14
-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
-rw-r--r--yage/yage.h3
8 files changed, 104 insertions, 8 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7a3abb66..5d8ae083 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -46,4 +46,5 @@ if($ENV{UNIT_TESTS})
make_test(spritesheettest ${SIMULATION_RUNS})
make_test(vector3test ${SIMULATION_RUNS})
make_test(vector4test ${SIMULATION_RUNS})
+ make_test(logtest 1)
endif()
diff --git a/tests/logtest.cpp b/tests/logtest.cpp
new file mode 100644
index 00000000..9cd5288a
--- /dev/null
+++ b/tests/logtest.cpp
@@ -0,0 +1,14 @@
+#include <yage.h>
+
+#include <iostream>
+
+int main()
+{
+ gLog << "Hello World";
+ yage::Logger l;
+ l() << "Hello my name is Yann";
+ std::cout << "#####################\n";
+
+ gLog << "Yanananan";
+ gLog << "Remove the top element";
+}
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
diff --git a/yage/yage.h b/yage/yage.h
index e6d64a28..8becefde 100644
--- a/yage/yage.h
+++ b/yage/yage.h
@@ -26,6 +26,9 @@
#include "core/texture.h"
#include "core/vertex.h"
#include "core/window.h"
+#include "core/logger.h"
+#include "core/logmessage.h"
+#include "core/logsink.h"
#include "physics/body.h"
#include "physics/particlebody.h"