summaryrefslogtreecommitdiffhomepage
path: root/log.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'log.cpp')
-rw-r--r--log.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/log.cpp b/log.cpp
index 7698e4f..dae56c7 100644
--- a/log.cpp
+++ b/log.cpp
@@ -2,3 +2,56 @@
log_stream log_cout;
+log_stream::log_stream(): m_active(false), m_buffer(), m_log_lines() {}
+
+void log_stream::log_lines(int n) {
+ m_log_lines = n;
+}
+
+std::string log_stream::get_log() {
+ return m_buffer.str();
+}
+
+// log to buffer
+void log_stream::activate()
+{
+ m_active = true;
+}
+
+// log to plain console
+void log_stream::deactivate()
+{
+ m_active = false;
+}
+
+log_stream& log_stream::operator<<(
+ std::basic_ostream<char>& (*func)
+ (std::basic_ostream<char>&) ) {
+ if (m_active) {
+ m_buffer << *func;
+ trim_buffer();
+ }
+ else
+ {
+ std::cout << *func;
+ }
+ return *this;
+}
+
+void log_stream::trim_buffer()
+{
+ std::string s = m_buffer.str();
+ size_t pos = s.npos;
+ for (int i = 0; i <= m_log_lines; ++i) {
+ pos = s.rfind("\n", pos);
+ if (pos == s.npos) {
+ // too few lines
+ return;
+ }
+ if (pos > 0) {
+ --pos;
+ }
+ }
+
+ m_buffer.str(s.substr((pos <= (s.size() - 2)) ? pos + 2 : pos));
+}