diff options
Diffstat (limited to 'multilog.cpp')
-rw-r--r-- | multilog.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/multilog.cpp b/multilog.cpp new file mode 100644 index 0000000..d2dce10 --- /dev/null +++ b/multilog.cpp @@ -0,0 +1,68 @@ +#include <iostream> +#include <string> +#include <cassert> +#include "multilog.h" +#include "params.h" + + +static int uniqid() { + static int i = 0; + return i++; +} + + +MultiLog::Item::Item() + : id(uniqid()) {} + +int MultiLog::add(const string_view prefix) { + lock_guard guard(mut); + + assert(prefix.find('\n') == string::npos); + + items.emplace_back(); + items.back().line = prefix; + if (multilog_fancy) { + cout << prefix << endl; + } else { + cout << "[" << items.back().id << "] " << prefix << endl; + } + return items.back().id; +} + +void MultiLog::append(int id, const string_view text) { + lock_guard guard(mut); + + assert(text.find('\n') == string::npos); + + size_t idx = findId(id); + items[idx].line += text; + if (multilog_fancy) { + redrawLine(idx); + } else { + cout << "[" << items[idx].id << "]... " << text << endl; + } +} + +void MultiLog::complete(int id) { + lock_guard guard(mut); + + size_t idx = findId(id); + items[idx].complete = true; + size_t nextIdx; + for (nextIdx = 0; nextIdx < items.size(); nextIdx++) { + if (!items[nextIdx].complete) break; + } + if (nextIdx > 0) items.erase(items.begin(), items.begin() + (nextIdx - 1)); +} + +size_t MultiLog::findId(int id) { + for (int i = 0; i < (int)items.size(); i++) { + if (items[i].id == id) return i; + } + assert(false); +} + +void MultiLog::redrawLine(size_t idx) { + size_t offset = items.size() - idx; + cout << "\r\x1B[" << offset << "A\x1B[K" << items[idx].line << "\r\x1B[" << offset << "B" << flush; +} |