#include "log.h" 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)); m_buffer.seekp(0, std::ios_base::end); }