48 bool isActive =
false;
51 enum InternalLogLevel { START = DEBUG_LOG + 1, END };
53 static const uint TIMER_MAX_CHAR_NUMBER = 12;
55 uint mPercPrecision = 0;
59 std::stack<std::pair<double, double>> mIntervals;
62 double mGlobalPercProgress = 0;
70 LogLevel mPrintLevel = PROGRESS_LOG;
73 ProgressStatus mProgress;
76 bool mPrintPerc =
true;
77 bool mPrintMsgDuringProgress =
true;
79 bool mPrintTimer =
false;
86 mIntervals.push({0, 100});
90 void enableIndentation() override final { mIndent =
true; }
92 void disableIndentation() override final { mIndent =
false; }
94 void enablePrintPercentage() override final { mPrintPerc =
true; }
96 void disablePrintPercentage() override final { mPrintPerc =
false; }
102 mPrintMsgDuringProgress =
true;
105 void disablePrintMessageDuringProgress() override final
107 mPrintMsgDuringProgress =
false;
110 void enablePrintTimer() override final { mPrintTimer =
true; }
112 void disablePrintTimer() override final { mPrintTimer =
false; }
114 void reset() override final
116 while (!mIntervals.empty())
118 mIntervals.push({0, 100});
122 void setMaxLineWidth(uint w)
override final { mLineWidth = w; }
124 void startTimer() override final { mTimer.
start(); }
126 void stopTimer() override final { mTimer.
stop(); }
137 std::pair<double, double>
actualP = mIntervals.top();
138 std::pair<double, double>
newP;
142 mGlobalPercProgress =
newP.first;
143 mIntervals.push(
newP);
147 void endTask(
const std::string& action)
override final
149 mGlobalPercProgress = mIntervals.top().second;
150 if (mIntervals.size() > 1) {
154 printLine(action, END);
158 double percentage() const override final
160 double k = std::pow(10, mPercPrecision);
161 uint c = mGlobalPercProgress * k;
165 virtual void setPercentage(uint newPerc)
override
167 if (newPerc >= 0 && newPerc <= 100) {
168 mGlobalPercProgress = (mIntervals.top().first) + mStep * newPerc;
172 void log(
const std::string&
msg)
const override final
174 printLine(
msg, PROGRESS_LOG);
177 void log(
const std::string&
msg, LogLevel
lvl)
const override final
182 void log(uint perc,
const std::string&
msg)
override final
184 log(perc,
msg, PROGRESS_LOG);
187 void log(uint perc,
const std::string&
msg, LogLevel
lvl)
override final
189 if (perc >= 0 && perc <= 100)
196 const std::string&
msg,
204 mProgress.isActive =
true;
205 mProgress.message =
msg;
211 if (mProgress.step == 0)
213 mProgress.lastProgress = 0;
219 mProgress.isActive =
false;
225 assert(mProgress.isActive);
227 if (mProgress.lastProgress <
progress) {
228 mProgress.perc =
progress * mProgress.percStep;
229 if (mPrintMsgDuringProgress)
230 log(mProgress.perc, mProgress.message, PROGRESS_LOG);
232 setPercentage(mProgress.perc);
249 virtual void alignLeft(
Stream&
o)
const {}
251 virtual void alignRight(
Stream&
o)
const {}
253 virtual void setWidth(Stream& o, uint w)
const {}
255 virtual void flush(Stream& o)
const {}
260 mStep = (mIntervals.top().second - mIntervals.top().first) / 100;
263 void printLine(
const std::string& msg, uint lvl)
const
265 if (!mPrintPerc && msg.empty())
269 LogLevel l = PROGRESS_LOG;
270 if (lvl <= DEBUG_LOG) {
281 s = printPercentage(*stream);
283 s += printIndentation(*stream);
284 printMessage(*stream, msg, lvl, s);
285 printElapsedTime(*stream);
291 uint printPercentage(Stream& o)
const
294 if (mPercPrecision > 0)
295 size += 1 + mPercPrecision;
300 o << percentage() <<
"%]";
304 uint printIndentation(Stream& o)
const
308 uint n = mIntervals.
size() - 1;
309 for (uint i = 0; i < n; i++) {
317 void printMessage(Stream& o,
const std::string& msg, uint lvl, uint n)
const
319 uint maxMsgSize = mLineWidth - n;
321 maxMsgSize -= TIMER_MAX_CHAR_NUMBER;
323 case LogLevel::ERROR_LOG:
327 case LogLevel::WARNING_LOG:
331 case LogLevel::PROGRESS_LOG:
335 case LogLevel::DEBUG_LOG:
339 case InternalLogLevel::START:
343 case InternalLogLevel::END:
348 setWidth(o, maxMsgSize);
353 void printElapsedTime(Stream& o)
const
357 setWidth(o, TIMER_MAX_CHAR_NUMBER - 3);
359 o << mTimer.
delay() <<
"s]";
void startProgress(const std::string &msg, uint progressSize, uint percPrintProgress=10, uint startPerc=0, uint endPerc=100) override final
Allows to easily manage progresses with the logger, along with the progress and endProgress member fu...
Definition logger.h:195