From 1f1e71e0d9e1a60eac38040ea5e6a49c14d81b71 Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Fri, 3 Jan 2025 18:36:05 +0100 Subject: Added log --- log.h | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 log.h (limited to 'log.h') diff --git a/log.h b/log.h new file mode 100644 index 0000000..cfc4d4c --- /dev/null +++ b/log.h @@ -0,0 +1,85 @@ +#pragma once + +#include +#include +#include +#include + +class log_stream +{ +public: + log_stream(): m_active(false), m_buffer(), m_log_lines() {} + + void log_lines(int n) { + m_log_lines = n; + } + + std::string get_log() { + return m_buffer.str(); + } + + // log to buffer + void activate() + { + m_active = true; + } + + // log to plain console + void deactivate() + { + m_active = false; + } + + template + log_stream& operator<<(const T& arg) { + if (m_active) { + m_buffer << arg; + trim_buffer(); + } + else + { + std::cout << arg; + } + return *this; + } + + log_stream& operator<<( + std::basic_ostream& (*func) + (std::basic_ostream&) ) { + if (m_active) { + m_buffer << *func; + trim_buffer(); + } + else + { + std::cout << *func; + } + return *this; + } + +private: + void 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)); + } + + bool m_active; + std::stringstream m_buffer; + int m_log_lines; +}; + +extern log_stream log_cout; + -- cgit v1.2.3