예제 #1
0
        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;
        }
예제 #2
0
    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;
    }