mirror of
https://github.com/minetest/minetest.git
synced 2025-01-08 22:37:32 +01:00
Make logging respect stream flushes
also add override keyword and fix overflow() behavior
This commit is contained in:
parent
dbf103da32
commit
99b6315c1a
@ -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;
|
||||
}
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user