Library of Assembled Shared Sources
progress_indicator.cpp
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2004-2011 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42
43#include "lass_common.h"
44#include "progress_indicator.h"
45#include "../num/basic_ops.h"
46
47namespace lass
48{
49namespace util
50{
51
52/** @param iDescriptor description printed at begin of the line
53 * @param iConsoleWidth maximum number of characters on one console text line (default=80)
54 */
55ProgressIndicator::ProgressIndicator(const std::string& iDescription, size_t iConsoleWidth):
56 avgStepDuration_(0.f),
57 previousTimeElapsed_(0.f),
58 description_(iDescription),
59 whitespace_(iConsoleWidth, ' '),
60 consoleWidth_(iConsoleWidth),
61 current_(0)
62{
63 std::ostringstream stepInfo;
64 stepInfo.copyfmt(std::cout);
65 stepInfo << description_ << ": 0%; CPU 0s" << whitespace_;
66 std::cout << stepInfo.str().substr(0, consoleWidth_ - 1) << std::flush;
67}
68
69/** print final message on destruction
70 */
72{
73 (*this)(num::NumTraits<double>::one);
74}
75
76/** update progress indicator
77 * @param iProgress value in range [0, 1]
78 */
79void ProgressIndicator::operator()(double iProgress)
80{
81 if (iProgress >= num::NumTraits<double>::one)
82 {
83 // final message
84 if (current_ != 6666)
85 {
86 std::ostringstream stepInfo;
87 stepInfo.copyfmt(std::cout);
88 stepInfo << description_ << ": 100%; CPU " << Clock::humanize(clock_.time())
89 << whitespace_;
90 std::cout << "\r" << stepInfo.str().substr(0, consoleWidth_ - 1) << std::endl;
91 current_ = 6666;
92 }
93 return;
94 }
95
96 iProgress = num::clamp(iProgress, num::NumTraits<double>::zero, num::NumTraits<double>::one);
97 const int promille = static_cast<int>(1000 * iProgress);
98
99 const Clock::TTime updateRate = 0.025f;
100
101 if (promille > current_)
102 {
103 const Clock::TTime timeElapsed = clock_.time();
104 const Clock::TTime stepDuration = (timeElapsed - previousTimeElapsed_) / (promille - current_);
105 if (promille < 5)
106 {
107 avgStepDuration_ = stepDuration;
108 }
109 else
110 {
111 avgStepDuration_ = num::lerp(avgStepDuration_, stepDuration, updateRate);
112 }
113 const Clock::TTime timeLeft = (1000 - promille) * avgStepDuration_;
114
115 std::ostringstream stepInfo;
116 stepInfo.copyfmt(std::cout);
117 stepInfo << description_ << ": " << std::fixed << std::setprecision(1) << (.1 * promille)
118 << "%; CPU " << Clock::humanize(timeElapsed)
119 << " [-" << Clock::humanize(timeLeft) << "]" << whitespace_;
120 std::cout << "\r" << stepInfo.str().substr(0, consoleWidth_ - 1) << std::flush;
121
122 current_ = promille;
123 previousTimeElapsed_ = timeElapsed;
124 }
125}
126
127}
128
129}
130
131// EOF
132
void operator()(double iProgress)
update progress indicator
~ProgressIndicator()
print final message on destruction
ProgressIndicator(const std::string &iDescription, size_t iConsoleWidth=80)
const T & clamp(const T &x, const T &min, const T &max)
if x < min return min, else if x > max return max, else return x.
Definition basic_ops.h:226
T lerp(const T &a, const T &b, const T &f)
linear interpolation between a and b
Definition basic_ops.h:234
general utility, debug facilities, ...
Library for Assembled Shared Sources.
Definition config.h:53