This commit is contained in:
Pranav Srinivas Kumar
2020-05-09 20:33:15 -05:00
parent 11ec12c0cb
commit 6f057a51a1
7 changed files with 135 additions and 72 deletions

View File

@@ -47,7 +47,7 @@ class BlockProgressBar {
option::PrefixText, option::PostfixText, option::ShowPercentage, option::PrefixText, option::PostfixText, option::ShowPercentage,
option::ShowElapsedTime, option::ShowRemainingTime, option::Completed, option::ShowElapsedTime, option::ShowRemainingTime, option::Completed,
option::SavedStartTime, option::MaxPostfixTextLen, option::FontStyles, option::SavedStartTime, option::MaxPostfixTextLen, option::FontStyles,
option::MaxProgress>; option::MaxProgress, option::Stream>;
public: public:
template <typename... Args, template <typename... Args,
@@ -82,7 +82,9 @@ public:
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::font_styles>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_progress>(option::MaxProgress{100}, details::get<details::ProgressBarOption::max_progress>(option::MaxProgress{100},
std::forward<Args>(args)...) std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>(
option::Stream{std::cout}, std::forward<Args>(args)...)
) {} ) {}
template <typename T, details::ProgressBarOption id> template <typename T, details::ProgressBarOption id>
@@ -185,6 +187,10 @@ private:
public: public:
void print_progress(bool from_multi_progress = false) { void print_progress(bool from_multi_progress = false) {
std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>();
const auto max_progress = get_value<details::ProgressBarOption::max_progress>(); const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
if (multi_progress_mode_ && !from_multi_progress) { if (multi_progress_mode_ && !from_multi_progress) {
if (progress_ > max_progress) { if (progress_ > max_progress) {
@@ -192,71 +198,71 @@ public:
} }
return; return;
} }
std::lock_guard<std::mutex> lock{mutex_};
auto now = std::chrono::high_resolution_clock::now(); auto now = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(now - start_time_point_); auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(now - start_time_point_);
if (get_value<details::ProgressBarOption::foreground_color>() != Color::unspecified) if (get_value<details::ProgressBarOption::foreground_color>() != Color::unspecified)
details::set_stream_color(std::cout, get_value<details::ProgressBarOption::foreground_color>()); details::set_stream_color(os, get_value<details::ProgressBarOption::foreground_color>());
for (auto &style : get_value<details::ProgressBarOption::font_styles>()) for (auto &style : get_value<details::ProgressBarOption::font_styles>())
details::set_font_style(std::cout, style); details::set_font_style(os, style);
std::cout << get_value<details::ProgressBarOption::prefix_text>(); os << get_value<details::ProgressBarOption::prefix_text>();
std::cout << get_value<details::ProgressBarOption::start>(); os << get_value<details::ProgressBarOption::start>();
details::BlockProgressScaleWriter writer{std::cout, details::BlockProgressScaleWriter writer{os,
get_value<details::ProgressBarOption::bar_width>()}; get_value<details::ProgressBarOption::bar_width>()};
writer.write(progress_ / max_progress * 100); writer.write(progress_ / max_progress * 100);
std::cout << get_value<details::ProgressBarOption::end>(); os << get_value<details::ProgressBarOption::end>();
if (get_value<details::ProgressBarOption::show_percentage>()) { if (get_value<details::ProgressBarOption::show_percentage>()) {
std::cout << " " << std::min(static_cast<size_t>(progress_ / max_progress * 100.0), size_t(100)) << "%"; os << " " << std::min(static_cast<size_t>(progress_ / max_progress * 100.0), size_t(100)) << "%";
} }
auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>(); auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>();
if (get_value<details::ProgressBarOption::show_elapsed_time>()) { if (get_value<details::ProgressBarOption::show_elapsed_time>()) {
std::cout << " ["; os << " [";
if (saved_start_time) if (saved_start_time)
details::write_duration(std::cout, elapsed); details::write_duration(os, elapsed);
else else
std::cout << "00:00s"; os << "00:00s";
} }
if (get_value<details::ProgressBarOption::show_remaining_time>()) { if (get_value<details::ProgressBarOption::show_remaining_time>()) {
if (get_value<details::ProgressBarOption::show_elapsed_time>()) if (get_value<details::ProgressBarOption::show_elapsed_time>())
std::cout << "<"; os << "<";
else else
std::cout << " ["; os << " [";
if (saved_start_time) { if (saved_start_time) {
auto eta = std::chrono::nanoseconds( auto eta = std::chrono::nanoseconds(
progress_ > 0 ? static_cast<long long>(elapsed.count() * max_progress / progress_) : 0); progress_ > 0 ? static_cast<long long>(elapsed.count() * max_progress / progress_) : 0);
auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta);
details::write_duration(std::cout, remaining); details::write_duration(os, remaining);
} else { } else {
std::cout << "00:00s"; os << "00:00s";
} }
std::cout << "]"; os << "]";
} else { } else {
if (get_value<details::ProgressBarOption::show_elapsed_time>()) if (get_value<details::ProgressBarOption::show_elapsed_time>())
std::cout << "]"; os << "]";
} }
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
std::cout << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ')
<< "\r"; << "\r";
std::cout.flush(); os.flush();
if (progress_ > max_progress) { if (progress_ > max_progress) {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;
} }
if (get_value<details::ProgressBarOption::completed>() && if (get_value<details::ProgressBarOption::completed>() &&
!from_multi_progress) // Don't std::endl if calling from MultiProgress !from_multi_progress) // Don't std::endl if calling from MultiProgress
std::cout << termcolor::reset << std::endl; os << termcolor::reset << std::endl;
} }
}; };

View File

@@ -49,7 +49,7 @@ class IndeterminateProgressBar {
std::tuple<option::BarWidth, option::PrefixText, option::PostfixText, option::Start, std::tuple<option::BarWidth, option::PrefixText, option::PostfixText, option::Start,
option::End, option::Fill, option::Lead, option::End, option::Fill, option::Lead,
option::MaxPostfixTextLen, option::Completed, option::MaxPostfixTextLen, option::Completed,
option::ForegroundColor, option::FontStyles>; option::ForegroundColor, option::FontStyles, option::Stream>;
enum class Direction { enum class Direction {
forward, forward,
@@ -85,7 +85,9 @@ public:
details::get<details::ProgressBarOption::foreground_color>( details::get<details::ProgressBarOption::foreground_color>(
option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...), option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::font_styles>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...)) { option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>(
option::Stream{std::cout}, std::forward<Args>(args)...)) {
// starts with [<==>...........] // starts with [<==>...........]
// progress_ = 0 // progress_ = 0
@@ -188,36 +190,39 @@ private:
public: public:
void print_progress(bool from_multi_progress = false) { void print_progress(bool from_multi_progress = false) {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>();
if (multi_progress_mode_ && !from_multi_progress) { if (multi_progress_mode_ && !from_multi_progress) {
return; return;
} }
if (get_value<details::ProgressBarOption::foreground_color>() != Color::unspecified) if (get_value<details::ProgressBarOption::foreground_color>() != Color::unspecified)
details::set_stream_color(std::cout, get_value<details::ProgressBarOption::foreground_color>()); details::set_stream_color(os, get_value<details::ProgressBarOption::foreground_color>());
for (auto &style : get_value<details::ProgressBarOption::font_styles>()) for (auto &style : get_value<details::ProgressBarOption::font_styles>())
details::set_font_style(std::cout, style); details::set_font_style(os, style);
std::cout << get_value<details::ProgressBarOption::prefix_text>(); os << get_value<details::ProgressBarOption::prefix_text>();
std::cout << get_value<details::ProgressBarOption::start>(); os << get_value<details::ProgressBarOption::start>();
details::IndeterminateProgressScaleWriter writer{std::cout, details::IndeterminateProgressScaleWriter writer{os,
get_value<details::ProgressBarOption::bar_width>(), get_value<details::ProgressBarOption::bar_width>(),
get_value<details::ProgressBarOption::fill>(), get_value<details::ProgressBarOption::fill>(),
get_value<details::ProgressBarOption::lead>()}; get_value<details::ProgressBarOption::lead>()};
writer.write(progress_); writer.write(progress_);
std::cout << get_value<details::ProgressBarOption::end>(); os << get_value<details::ProgressBarOption::end>();
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
std::cout << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ')
<< "\r"; << "\r";
std::cout.flush(); os.flush();
if (get_value<details::ProgressBarOption::completed>() && if (get_value<details::ProgressBarOption::completed>() &&
!from_multi_progress) // Don't std::endl if calling from MultiProgress !from_multi_progress) // Don't std::endl if calling from MultiProgress
std::cout << termcolor::reset << std::endl; os << termcolor::reset << std::endl;
} }
}; };

View File

@@ -50,7 +50,7 @@ class ProgressBar {
option::End, option::Fill, option::Lead, option::Remainder, option::End, option::Fill, option::Lead, option::Remainder,
option::MaxPostfixTextLen, option::Completed, option::ShowPercentage, option::MaxPostfixTextLen, option::Completed, option::ShowPercentage,
option::ShowElapsedTime, option::ShowRemainingTime, option::SavedStartTime, option::ShowElapsedTime, option::ShowRemainingTime, option::SavedStartTime,
option::ForegroundColor, option::FontStyles, option::MaxProgress>; option::ForegroundColor, option::FontStyles, option::MaxProgress, option::Stream>;
public: public:
template <typename... Args, template <typename... Args,
@@ -91,7 +91,9 @@ public:
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::font_styles>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_progress>( details::get<details::ProgressBarOption::max_progress>(
option::MaxProgress{100}, std::forward<Args>(args)...)) {} option::MaxProgress{100}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>(
option::Stream{std::cout}, std::forward<Args>(args)...)) {}
template <typename T, details::ProgressBarOption id> template <typename T, details::ProgressBarOption id>
void set_option(details::Setting<T, id> &&setting) { void set_option(details::Setting<T, id> &&setting) {
@@ -196,6 +198,9 @@ private:
public: public:
void print_progress(bool from_multi_progress = false) { void print_progress(bool from_multi_progress = false) {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>();
const auto max_progress = get_value<details::ProgressBarOption::max_progress>(); const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
if (multi_progress_mode_ && !from_multi_progress) { if (multi_progress_mode_ && !from_multi_progress) {
if (progress_ >= max_progress) { if (progress_ >= max_progress) {
@@ -208,71 +213,71 @@ public:
elapsed_ = std::chrono::duration_cast<std::chrono::nanoseconds>(now - start_time_point_); elapsed_ = std::chrono::duration_cast<std::chrono::nanoseconds>(now - start_time_point_);
if (get_value<details::ProgressBarOption::foreground_color>() != Color::unspecified) if (get_value<details::ProgressBarOption::foreground_color>() != Color::unspecified)
details::set_stream_color(std::cout, get_value<details::ProgressBarOption::foreground_color>()); details::set_stream_color(os, get_value<details::ProgressBarOption::foreground_color>());
for (auto &style : get_value<details::ProgressBarOption::font_styles>()) for (auto &style : get_value<details::ProgressBarOption::font_styles>())
details::set_font_style(std::cout, style); details::set_font_style(os, style);
std::cout << get_value<details::ProgressBarOption::prefix_text>(); os << get_value<details::ProgressBarOption::prefix_text>();
std::cout << get_value<details::ProgressBarOption::start>(); os << get_value<details::ProgressBarOption::start>();
details::ProgressScaleWriter writer{std::cout, details::ProgressScaleWriter writer{os,
get_value<details::ProgressBarOption::bar_width>(), get_value<details::ProgressBarOption::bar_width>(),
get_value<details::ProgressBarOption::fill>(), get_value<details::ProgressBarOption::fill>(),
get_value<details::ProgressBarOption::lead>(), get_value<details::ProgressBarOption::lead>(),
get_value<details::ProgressBarOption::remainder>()}; get_value<details::ProgressBarOption::remainder>()};
writer.write(double(progress_) / double(max_progress) * 100.0f); writer.write(double(progress_) / double(max_progress) * 100.0f);
std::cout << get_value<details::ProgressBarOption::end>(); os << get_value<details::ProgressBarOption::end>();
if (get_value<details::ProgressBarOption::show_percentage>()) { if (get_value<details::ProgressBarOption::show_percentage>()) {
std::cout << " " << std::min(static_cast<size_t>(static_cast<float>(progress_) / max_progress * 100), size_t(100)) << "%"; os << " " << std::min(static_cast<size_t>(static_cast<float>(progress_) / max_progress * 100), size_t(100)) << "%";
} }
auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>(); auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>();
if (get_value<details::ProgressBarOption::show_elapsed_time>()) { if (get_value<details::ProgressBarOption::show_elapsed_time>()) {
std::cout << " ["; os << " [";
if (saved_start_time) if (saved_start_time)
details::write_duration(std::cout, elapsed_); details::write_duration(os, elapsed_);
else else
std::cout << "00:00s"; os << "00:00s";
} }
if (get_value<details::ProgressBarOption::show_remaining_time>()) { if (get_value<details::ProgressBarOption::show_remaining_time>()) {
if (get_value<details::ProgressBarOption::show_elapsed_time>()) if (get_value<details::ProgressBarOption::show_elapsed_time>())
std::cout << "<"; os << "<";
else else
std::cout << " ["; os << " [";
if (saved_start_time) { if (saved_start_time) {
auto eta = std::chrono::nanoseconds( auto eta = std::chrono::nanoseconds(
progress_ > 0 ? static_cast<long long>(elapsed_.count() * max_progress / progress_) : 0); progress_ > 0 ? static_cast<long long>(elapsed_.count() * max_progress / progress_) : 0);
auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta); auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta);
details::write_duration(std::cout, remaining); details::write_duration(os, remaining);
} else { } else {
std::cout << "00:00s"; os << "00:00s";
} }
std::cout << "]"; os << "]";
} else { } else {
if (get_value<details::ProgressBarOption::show_elapsed_time>()) if (get_value<details::ProgressBarOption::show_elapsed_time>())
std::cout << "]"; os << "]";
} }
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
std::cout << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ')
<< "\r"; << "\r";
std::cout.flush(); os.flush();
if (progress_ >= max_progress) { if (progress_ >= max_progress) {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;
} }
if (get_value<details::ProgressBarOption::completed>() && if (get_value<details::ProgressBarOption::completed>() &&
!from_multi_progress) // Don't std::endl if calling from MultiProgress !from_multi_progress) // Don't std::endl if calling from MultiProgress
std::cout << termcolor::reset << std::endl; os << termcolor::reset << std::endl;
} }
}; };

View File

@@ -50,7 +50,7 @@ class ProgressSpinner {
option::ShowPercentage, option::ShowElapsedTime, option::ShowRemainingTime, option::ShowPercentage, option::ShowElapsedTime, option::ShowRemainingTime,
option::ShowSpinner, option::SavedStartTime, option::Completed, option::ShowSpinner, option::SavedStartTime, option::Completed,
option::MaxPostfixTextLen, option::SpinnerStates, option::FontStyles, option::MaxPostfixTextLen, option::SpinnerStates, option::FontStyles,
option::MaxProgress>; option::MaxProgress, option::Stream>;
public: public:
template <typename... Args, template <typename... Args,
@@ -85,7 +85,9 @@ public:
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::font_styles>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_progress>( details::get<details::ProgressBarOption::max_progress>(
option::MaxProgress{100}, std::forward<Args>(args)...)) {} option::MaxProgress{100}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>(
option::Stream{std::cout}, std::forward<Args>(args)...)) {}
template <typename T, details::ProgressBarOption id> template <typename T, details::ProgressBarOption id>
void set_option(details::Setting<T, id> &&setting) { void set_option(details::Setting<T, id> &&setting) {
@@ -185,56 +187,59 @@ private:
public: public:
void print_progress() { void print_progress() {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>();
const auto max_progress = get_value<details::ProgressBarOption::max_progress>(); const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
auto now = std::chrono::high_resolution_clock::now(); auto now = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(now - start_time_point_); auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(now - start_time_point_);
if (get_value<details::ProgressBarOption::foreground_color>() != Color::unspecified) if (get_value<details::ProgressBarOption::foreground_color>() != Color::unspecified)
details::set_stream_color(std::cout, get_value<details::ProgressBarOption::foreground_color>()); details::set_stream_color(os, get_value<details::ProgressBarOption::foreground_color>());
for (auto &style : get_value<details::ProgressBarOption::font_styles>()) for (auto &style : get_value<details::ProgressBarOption::font_styles>())
details::set_font_style(std::cout, style); details::set_font_style(os, style);
std::cout << get_value<details::ProgressBarOption::prefix_text>(); os << get_value<details::ProgressBarOption::prefix_text>();
if (get_value<details::ProgressBarOption::spinner_show>()) if (get_value<details::ProgressBarOption::spinner_show>())
std::cout << get_value<details::ProgressBarOption::spinner_states>() os << get_value<details::ProgressBarOption::spinner_states>()
[index_ % get_value<details::ProgressBarOption::spinner_states>().size()]; [index_ % get_value<details::ProgressBarOption::spinner_states>().size()];
if (get_value<details::ProgressBarOption::show_percentage>()) { if (get_value<details::ProgressBarOption::show_percentage>()) {
std::cout << " " << std::min(progress_, size_t(max_progress)) << "%"; os << " " << std::min(progress_, size_t(max_progress)) << "%";
} }
if (get_value<details::ProgressBarOption::show_elapsed_time>()) { if (get_value<details::ProgressBarOption::show_elapsed_time>()) {
std::cout << " ["; os << " [";
details::write_duration(std::cout, elapsed); details::write_duration(os, elapsed);
} }
if (get_value<details::ProgressBarOption::show_remaining_time>()) { if (get_value<details::ProgressBarOption::show_remaining_time>()) {
if (get_value<details::ProgressBarOption::show_elapsed_time>()) if (get_value<details::ProgressBarOption::show_elapsed_time>())
std::cout << "<"; os << "<";
else else
std::cout << " ["; os << " [";
auto eta = std::chrono::nanoseconds( auto eta = std::chrono::nanoseconds(
progress_ > 0 ? static_cast<long long>(elapsed.count() * max_progress / progress_) : 0); progress_ > 0 ? static_cast<long long>(elapsed.count() * max_progress / progress_) : 0);
auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta); auto remaining = eta > elapsed ? (eta - elapsed) : (elapsed - eta);
details::write_duration(std::cout, remaining); details::write_duration(os, remaining);
std::cout << "]"; os << "]";
} else { } else {
if (get_value<details::ProgressBarOption::show_elapsed_time>()) if (get_value<details::ProgressBarOption::show_elapsed_time>())
std::cout << "]"; os << "]";
} }
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
std::cout << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ')
<< "\r"; << "\r";
std::cout.flush(); os.flush();
index_ += 1; index_ += 1;
if (progress_ > max_progress) { if (progress_ > max_progress) {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;
} }
if (get_value<details::ProgressBarOption::completed>()) if (get_value<details::ProgressBarOption::completed>())
std::cout << termcolor::reset << std::endl; os << termcolor::reset << std::endl;
} }
}; };

View File

@@ -90,7 +90,8 @@ enum class ProgressBarOption {
spinner_states, spinner_states,
font_styles, font_styles,
hide_bar_when_complete, hide_bar_when_complete,
max_progress max_progress,
stream
}; };
template <typename T, ProgressBarOption Id> struct Setting { template <typename T, ProgressBarOption Id> struct Setting {
@@ -206,5 +207,6 @@ using HideBarWhenComplete =
using FontStyles = using FontStyles =
details::Setting<std::vector<FontStyle>, details::ProgressBarOption::font_styles>; details::Setting<std::vector<FontStyle>, details::ProgressBarOption::font_styles>;
using MaxProgress = details::IntegerSetting<details::ProgressBarOption::max_progress>; using MaxProgress = details::IntegerSetting<details::ProgressBarOption::max_progress>;
using Stream = details::Setting<std::ostream&, details::ProgressBarOption::stream>;
} // namespace option } // namespace option
} // namespace indicators } // namespace indicators

View File

@@ -11,6 +11,9 @@ target_link_libraries(progress_bar_set_progress PRIVATE indicators::indicators)
add_executable(progress_bar_tick progress_bar_tick.cpp) add_executable(progress_bar_tick progress_bar_tick.cpp)
target_link_libraries(progress_bar_tick PRIVATE indicators::indicators) target_link_libraries(progress_bar_tick PRIVATE indicators::indicators)
add_executable(progress_bar_sstream progress_bar_sstream.cpp)
target_link_libraries(progress_bar_sstream PRIVATE indicators::indicators)
add_executable(progress_spinner progress_spinner.cpp) add_executable(progress_spinner progress_spinner.cpp)
target_link_libraries(progress_spinner PRIVATE indicators::indicators) target_link_libraries(progress_spinner PRIVATE indicators::indicators)

View File

@@ -0,0 +1,37 @@
#include <chrono>
#include <indicators/progress_bar.hpp>
#include <thread>
#include <sstream>
int main() {
using namespace indicators;
std::stringstream os;
ProgressBar bar{
option::BarWidth{50},
option::Start{"["},
option::Fill{"="},
option::Lead{">"},
option::Remainder{" "},
option::End{"]"},
option::PostfixText{"Getting started"},
option::ForegroundColor{indicators::Color::green},
option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}},
option::Stream{os}
};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
std::cout << "Stream contents:\n";
std::cout << os.str() << "\n";
return 0;
}