From 62f1bfed99b82bc073c138a00ff9a30bb596d09d Mon Sep 17 00:00:00 2001 From: Adrian Herrera Date: Tue, 20 Jul 2021 04:23:26 +0000 Subject: utils: added optimin corpus minimizer --- utils/optimin/src/ProgressBar.h | 58 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 utils/optimin/src/ProgressBar.h (limited to 'utils/optimin/src/ProgressBar.h') diff --git a/utils/optimin/src/ProgressBar.h b/utils/optimin/src/ProgressBar.h new file mode 100644 index 00000000..2f8d7403 --- /dev/null +++ b/utils/optimin/src/ProgressBar.h @@ -0,0 +1,58 @@ +/** + * Progress bar. + * + * Adapted from https://www.bfilipek.com/2020/02/inidicators.html + */ + +#pragma once + +#include +#include + +/// Display a progress bar in the terminal +class ProgressBar { + private: + const size_t BarWidth; + const std::string Fill; + const std::string Remainder; + + public: + ProgressBar() : ProgressBar(60, "#", " ") { + } + + ProgressBar(size_t Width, const llvm::StringRef F, const llvm::StringRef R) + : BarWidth(Width), Fill(F), Remainder(R) { + } + + void update(float Progress, const llvm::StringRef Status = "", + llvm::raw_ostream &OS = llvm::outs()) { + // No need to write once progress is 100% + if (Progress > 100.0f) return; + + // Move cursor to the first position on the same line and flush + OS << '\r'; + OS.flush(); + + // Start bar + OS << '['; + + const auto Completed = + static_cast(Progress * static_cast(BarWidth) / 100.0); + for (size_t I = 0; I < BarWidth; ++I) { + if (I <= Completed) { + OS << Fill; + } else { + OS << Remainder; + } + } + + // End bar + OS << ']'; + + // Write progress percentage + OS << ' ' << std::min(static_cast(Progress), size_t(100)) << '%'; + + // Write status text + OS << " " << Status; + } +}; -- cgit 1.4.1