mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	Make logging respect stream flushes
also add override keyword and fix overflow() behavior
This commit is contained in:
		@@ -23,48 +23,55 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
#include <string_view>
 | 
			
		||||
#include <functional>
 | 
			
		||||
 | 
			
		||||
template<int BufferLength, typename Emitter = std::function<void(std::string_view)> >
 | 
			
		||||
template<unsigned int BufferLength, typename Emitter = std::function<void(std::string_view)> >
 | 
			
		||||
class StringStreamBuffer : public std::streambuf {
 | 
			
		||||
public:
 | 
			
		||||
	StringStreamBuffer(Emitter emitter) : m_emitter(emitter) {
 | 
			
		||||
		buffer_index = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int overflow(int c) {
 | 
			
		||||
		push_back(c);
 | 
			
		||||
		return c;
 | 
			
		||||
	int overflow(int c) override {
 | 
			
		||||
		if (c != traits_type::eof())
 | 
			
		||||
			push_back(c);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void push_back(char c) {
 | 
			
		||||
		if (c == '\n' || c == '\r') {
 | 
			
		||||
			if (buffer_index)
 | 
			
		||||
				m_emitter(std::string_view(buffer, buffer_index));
 | 
			
		||||
			buffer_index = 0;
 | 
			
		||||
		// emit only complete lines, or if the buffer is full
 | 
			
		||||
		if (c == '\n') {
 | 
			
		||||
			sync();
 | 
			
		||||
		} else {
 | 
			
		||||
			buffer[buffer_index++] = c;
 | 
			
		||||
			if (buffer_index >= BufferLength) {
 | 
			
		||||
				m_emitter(std::string_view(buffer, buffer_index));
 | 
			
		||||
				buffer_index = 0;
 | 
			
		||||
				sync();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::streamsize xsputn(const char *s, std::streamsize n) {
 | 
			
		||||
	std::streamsize xsputn(const char *s, std::streamsize n) override {
 | 
			
		||||
		for (std::streamsize i = 0; i < n; ++i)
 | 
			
		||||
			push_back(s[i]);
 | 
			
		||||
		return n;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int sync() override {
 | 
			
		||||
		if (buffer_index)
 | 
			
		||||
			m_emitter(std::string_view(buffer, buffer_index));
 | 
			
		||||
		buffer_index = 0;
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	Emitter m_emitter;
 | 
			
		||||
	unsigned int buffer_index;
 | 
			
		||||
	char buffer[BufferLength];
 | 
			
		||||
	int buffer_index;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class DummyStreamBuffer : public std::streambuf {
 | 
			
		||||
	int overflow(int c) {
 | 
			
		||||
		return c;
 | 
			
		||||
	int overflow(int c) override {
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	std::streamsize xsputn(const char *s, std::streamsize n) {
 | 
			
		||||
	std::streamsize xsputn(const char *s, std::streamsize n) override {
 | 
			
		||||
		return n;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user