From b2c35cdf69a9084806ac7930cf4475980d596cf6 Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Sat, 4 Jan 2025 11:28:20 +0100 Subject: Separate out implementation from headers --- log.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'log.cpp') 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& (*func) + (std::basic_ostream&) ) { + 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)); +} -- cgit v1.2.3