diff options
-rw-r--r-- | src/build.cc | 5 | ||||
-rw-r--r-- | src/build.h | 28 |
2 files changed, 15 insertions, 18 deletions
diff --git a/src/build.cc b/src/build.cc index 5a0c3b3..a2f2720 100644 --- a/src/build.cc +++ b/src/build.cc @@ -17,6 +17,7 @@ #include <assert.h> #include <stdio.h> #include <stdlib.h> +#include <functional> #ifdef _WIN32 #include <windows.h> @@ -180,14 +181,14 @@ string BuildStatus::FormatProgressStatus( // Overall finished edges per second. case 'o': overall_rate_.UpdateRate(finished_edges_); - overall_rate_.snprinfRate(buf, "%.1f"); + snprinfRate(overall_rate_.rate(), buf, "%.1f"); out += buf; break; // Current rate, average over the last '-j' jobs. case 'c': current_rate_.UpdateRate(finished_edges_); - current_rate_.snprinfRate(buf, "%.1f"); + snprinfRate(current_rate_.rate(), buf, "%.1f"); out += buf; break; diff --git a/src/build.h b/src/build.h index 0902a4c..8876d88 100644 --- a/src/build.h +++ b/src/build.h @@ -200,31 +200,33 @@ struct BuildStatus { /// The custom progress status format to use. const char* progress_status_format_; + template<size_t S> + void snprinfRate(double rate, char(&buf)[S], const char* format) const { + if (rate == -1) snprintf(buf, S, "?"); + else snprintf(buf, S, format, rate); + } + struct RateInfo { RateInfo() : rate_(-1) {} void Restart() { stopwatch_.Restart(); } + double rate() { return rate_; } void UpdateRate(int edges) { if (edges && stopwatch_.Elapsed()) rate_ = edges / stopwatch_.Elapsed(); } - template<class T> - void snprinfRate(T buf, const char* format) { - if (rate_ == -1) snprintf(buf, sizeof(buf), "?"); - else snprintf(buf, sizeof(buf), format, rate_); - } - private: - Stopwatch stopwatch_; double rate_; + Stopwatch stopwatch_; }; struct SlidingRateInfo { - SlidingRateInfo(int n) : N(n), last_update_(-1), rate_(-1) {} + SlidingRateInfo(int n) : rate_(-1), N(n), last_update_(-1) {} void Restart() { stopwatch_.Restart(); } + double rate() { return rate_; } void UpdateRate(int update_hint) { if (update_hint == last_update_) @@ -238,18 +240,12 @@ struct BuildStatus { rate_ = times_.size() / (times_.back() - times_.front()); } - template<class T> - void snprinfRate(T buf, const char* format) { - if (rate_ == -1) snprintf(buf, sizeof(buf), "?"); - else snprintf(buf, sizeof(buf), format, rate_); - } - private: + double rate_; + Stopwatch stopwatch_; const size_t N; std::queue<double> times_; - Stopwatch stopwatch_; int last_update_; - double rate_; }; mutable RateInfo overall_rate_; |