From c3ff1fbd919a6019f1ff936ff8ba7eefb0d5ec96 Mon Sep 17 00:00:00 2001 From: Seth Parker Date: Thu, 12 Nov 2020 13:21:42 -0500 Subject: [PATCH 1/3] Mitigate overflow when calculating eta --- include/indicators/progress_bar.hpp | 2 +- single_include/indicators/indicators.hpp | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/include/indicators/progress_bar.hpp b/include/indicators/progress_bar.hpp index 5ca7938..384e682 100644 --- a/include/indicators/progress_bar.hpp +++ b/include/indicators/progress_bar.hpp @@ -256,7 +256,7 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( progress_ > 0 ? static_cast(elapsed_.count() * - max_progress / progress_) + (max_progress / progress_)) : 0); auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta); details::write_duration(os, remaining); diff --git a/single_include/indicators/indicators.hpp b/single_include/indicators/indicators.hpp index 72c26b7..d12227a 100644 --- a/single_include/indicators/indicators.hpp +++ b/single_include/indicators/indicators.hpp @@ -1789,7 +1789,7 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( progress_ > 0 ? static_cast(elapsed_.count() * - max_progress / progress_) + (max_progress / progress_)) : 0); auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta); details::write_duration(os, remaining); @@ -2089,7 +2089,9 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(elapsed.count() * max_progress / progress_) : 0); + progress_ > 0 ? static_cast(elapsed.count() * + (max_progress / progress_)) + : 0); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); details::write_duration(os, remaining); } else { @@ -2796,7 +2798,9 @@ public: else os << " ["; auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(elapsed.count() * max_progress / progress_) : 0); + progress_ > 0 ? static_cast(elapsed.count() * + (max_progress / progress_)) + : 0); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); details::write_duration(os, remaining); os << "]"; From e01c2950f2954b5bb0c479b1ba33dc82cbacfb9d Mon Sep 17 00:00:00 2001 From: Seth Parker Date: Mon, 16 Nov 2020 10:54:05 -0500 Subject: [PATCH 2/3] Use floats for remaining time math --- include/indicators/block_progress_bar.hpp | 4 +++- include/indicators/progress_bar.hpp | 4 ++-- include/indicators/progress_spinner.hpp | 4 +++- single_include/indicators/indicators.hpp | 12 ++++++------ 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/indicators/block_progress_bar.hpp b/include/indicators/block_progress_bar.hpp index dabb901..9c7f8eb 100644 --- a/include/indicators/block_progress_bar.hpp +++ b/include/indicators/block_progress_bar.hpp @@ -200,7 +200,9 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(elapsed.count() * max_progress / progress_) : 0); + progress_ > 0 ? static_cast(float(elapsed.count()) * + max_progress / progress_) + : 0); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); details::write_duration(os, remaining); } else { diff --git a/include/indicators/progress_bar.hpp b/include/indicators/progress_bar.hpp index 384e682..e976fbe 100644 --- a/include/indicators/progress_bar.hpp +++ b/include/indicators/progress_bar.hpp @@ -255,8 +255,8 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(elapsed_.count() * - (max_progress / progress_)) + progress_ > 0 ? static_cast(float(elapsed_.count()) * + max_progress / progress_) : 0); auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta); details::write_duration(os, remaining); diff --git a/include/indicators/progress_spinner.hpp b/include/indicators/progress_spinner.hpp index 72b2668..2fdb199 100644 --- a/include/indicators/progress_spinner.hpp +++ b/include/indicators/progress_spinner.hpp @@ -195,7 +195,9 @@ public: else os << " ["; auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(elapsed.count() * max_progress / progress_) : 0); + progress_ > 0 ? static_cast(float(elapsed.count()) * + max_progress / progress_) + : 0); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); details::write_duration(os, remaining); os << "]"; diff --git a/single_include/indicators/indicators.hpp b/single_include/indicators/indicators.hpp index d12227a..c8a48f6 100644 --- a/single_include/indicators/indicators.hpp +++ b/single_include/indicators/indicators.hpp @@ -1788,8 +1788,8 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(elapsed_.count() * - (max_progress / progress_)) + progress_ > 0 ? static_cast(float(elapsed_.count()) * + max_progress / progress_) : 0); auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta); details::write_duration(os, remaining); @@ -2089,8 +2089,8 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(elapsed.count() * - (max_progress / progress_)) + progress_ > 0 ? static_cast(float(elapsed.count()) * + max_progress / progress_) : 0); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); details::write_duration(os, remaining); @@ -2798,8 +2798,8 @@ public: else os << " ["; auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(elapsed.count() * - (max_progress / progress_)) + progress_ > 0 ? static_cast(float(elapsed.count()) * + max_progress / progress_) : 0); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); details::write_duration(os, remaining); From d11ffd91c6b47b4cdfaa345bd1e32062de7aa43a Mon Sep 17 00:00:00 2001 From: Seth Parker Date: Mon, 16 Nov 2020 11:27:16 -0500 Subject: [PATCH 3/3] Round time estimate up to nearest nanosecond --- include/indicators/block_progress_bar.hpp | 7 ++++--- include/indicators/progress_bar.hpp | 7 ++++--- include/indicators/progress_spinner.hpp | 7 ++++--- single_include/indicators/indicators.hpp | 21 ++++++++++++--------- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/include/indicators/block_progress_bar.hpp b/include/indicators/block_progress_bar.hpp index 9c7f8eb..dfc16af 100644 --- a/include/indicators/block_progress_bar.hpp +++ b/include/indicators/block_progress_bar.hpp @@ -200,9 +200,10 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(float(elapsed.count()) * - max_progress / progress_) - : 0); + progress_ > 0 + ? static_cast(std::ceil(float(elapsed.count()) * + max_progress / progress_)) + : 0); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); details::write_duration(os, remaining); } else { diff --git a/include/indicators/progress_bar.hpp b/include/indicators/progress_bar.hpp index e976fbe..2ee8f58 100644 --- a/include/indicators/progress_bar.hpp +++ b/include/indicators/progress_bar.hpp @@ -255,9 +255,10 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(float(elapsed_.count()) * - max_progress / progress_) - : 0); + progress_ > 0 + ? static_cast(std::ceil(float(elapsed_.count()) * + max_progress / progress_)) + : 0); auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta); details::write_duration(os, remaining); } else { diff --git a/include/indicators/progress_spinner.hpp b/include/indicators/progress_spinner.hpp index 2fdb199..09e0b13 100644 --- a/include/indicators/progress_spinner.hpp +++ b/include/indicators/progress_spinner.hpp @@ -195,9 +195,10 @@ public: else os << " ["; auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(float(elapsed.count()) * - max_progress / progress_) - : 0); + progress_ > 0 + ? static_cast(std::ceil(float(elapsed.count()) * + max_progress / progress_)) + : 0); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); details::write_duration(os, remaining); os << "]"; diff --git a/single_include/indicators/indicators.hpp b/single_include/indicators/indicators.hpp index c8a48f6..da35855 100644 --- a/single_include/indicators/indicators.hpp +++ b/single_include/indicators/indicators.hpp @@ -1788,9 +1788,10 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(float(elapsed_.count()) * - max_progress / progress_) - : 0); + progress_ > 0 + ? static_cast(std::ceil(float(elapsed_.count()) * + max_progress / progress_)) + : 0); auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta); details::write_duration(os, remaining); } else { @@ -2089,9 +2090,10 @@ private: if (saved_start_time) { auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(float(elapsed.count()) * - max_progress / progress_) - : 0); + progress_ > 0 + ? static_cast(std::ceil(float(elapsed.count()) * + max_progress / progress_)) + : 0); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); details::write_duration(os, remaining); } else { @@ -2798,9 +2800,10 @@ public: else os << " ["; auto eta = std::chrono::nanoseconds( - progress_ > 0 ? static_cast(float(elapsed.count()) * - max_progress / progress_) - : 0); + progress_ > 0 + ? static_cast(std::ceil(float(elapsed.count()) * + max_progress / progress_)) + : 0); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); details::write_duration(os, remaining); os << "]";