virtual int overflow(int c) { if (!enabled) return c; if (lastUser != this) { if (column != 0) { os.put('\n'); ++lineno; column = 0; mh.stepCount = 0; } lastUser = this; } if (c == EOF) return EOF; if (column == 0) { if (isspace(c)) return c; for (int i = mh.indent; i > 0; --i) { os.put(' '); ++column; } } os.put(c); if (c == '\n') { ++lineno; column = 0; mh.stepCount = 0; } else { ++column; } if (c == '.' && ++mh.stepCount >= 50) { ResourceUsage usage; ResourceUsage diff = usage - mh.prevUsage; os << " " << diff.elapsedTime() << ", " << diff.memory() << "\n"; // auto backup = os.flags(std::ios::fixed); // os << " " << std::setprecision(2) << diff.utime << "s, "; // os << std::setprecision(0) << diff.maxrss / 1024.0 << "MB\n"; // os.flags(backup); ++lineno; column = 0; mh.prevUsage = usage; mh.stepCount = 0; } return c; }
MessageHandler_& step(char dot = '-') { if (!enabled) return *this; if (!stepping && dotTime + 4 < std::time(0)) { *this << '\n'; stepping = true; } if (stepping) { if (stepCount % 50 != column - indent) { *this << '\n'; for (int i = stepCount % 50; i > 0; --i) { *this << '-'; } } *this << dot; ++stepCount; if (column - indent >= 50) { ResourceUsage usage; ResourceUsage diff = usage - prevUsage; *this << std::setw(3) << std::right << (stepCount * 100 / totalSteps); *this << "% (" << diff.elapsedTime() << ", " << diff.memory() << ")\n"; prevUsage = usage; } } else { ++stepCount; while (dotCount * totalSteps < stepCount * 10) { if (dotCount == 0) *this << ' '; *this << '.'; ++dotCount; dotTime = std::time(0); } } return *this; }