#include <string>
#include <memory>
#include <iostream>
namespace console
{
class Logger
{
public:
Logger();
Logger(std::shared_ptr<std::ostream>);
Logger& replace(std::string);
Logger& append(std::string);
Logger& newline();
private:
void erase(size_t);
std::shared_ptr<std::ostream> _out;
size_t _lineLength = 0;
};
}
console::Logger::Logger()
: _out(std::shared_ptr<std::ostream>(&std::cout, [](void*) {}))
{
}
console::Logger::Logger(std::shared_ptr<std::ostream> out)
: _out(out)
{
}
console::Logger& console::Logger::replace(std::string str)
{
erase(_lineLength);
_lineLength = 0;
append(str);
return *this;
}
console::Logger& console::Logger::append(std::string str)
{
*_out.get() << str << std::flush;
_lineLength += str.size();
return *this;
}
console::Logger& console::Logger::newline()
{
*_out.get() << std::endl;
_lineLength = 0;
return *this;
}
void console::Logger::erase(size_t size)
{
// go back
for (size_t i = 0; i < size; ++i) {
*_out.get() << '\b';
}
// replace by space
for (size_t i = 0; i < size; ++i) {
*_out.get() << ' ';
}
// go back again
for (size_t i = 0; i < size; ++i) {
*_out.get() << '\b';
}
}
int main() {
console::Logger log;
log.append("hello").replace("hi").newline().append("hey");
return 0;
}