diff --git a/README.md b/README.md index 762c1ae..8b843b4 100644 --- a/README.md +++ b/README.md @@ -442,35 +442,59 @@ using namespace indicators; int main() { - ProgressBar bar1{option::BarWidth{50}, option::ForegroundColor{Color::red}, - option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, - option::PrefixText{"5c90d4a2d1a8: Downloading "}}; + auto bar1 = std::make_unique(option::BarWidth{50}, + option::ForegroundColor{Color::red}, + option::ShowElapsedTime{true}, + option::ShowRemainingTime{true}, + option::PrefixText{"5c90d4a2d1a8: Downloading "}, + indicators::option::FontStyles{ + std::vector{indicators::FontStyle::bold}}); - ProgressBar bar2{option::BarWidth{50}, option::ForegroundColor{Color::yellow}, - option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, - option::PrefixText{"22337bfd13a9: Downloading "}}; + auto bar2 = std::make_unique(option::BarWidth{50}, + option::ForegroundColor{Color::yellow}, + option::ShowElapsedTime{true}, + option::ShowRemainingTime{true}, + option::PrefixText{"22337bfd13a9: Downloading "}, + indicators::option::FontStyles{ + std::vector{indicators::FontStyle::bold}}); - ProgressBar bar3{option::BarWidth{50}, option::ForegroundColor{Color::green}, - option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, - option::PrefixText{"10f26c680a34: Downloading "}}; + auto bar3 = std::make_unique(option::BarWidth{50}, + option::ForegroundColor{Color::green}, + option::ShowElapsedTime{true}, + option::ShowRemainingTime{true}, + option::PrefixText{"10f26c680a34: Downloading "}, + indicators::option::FontStyles{ + std::vector{indicators::FontStyle::bold}}); - ProgressBar bar4{option::BarWidth{50}, option::ForegroundColor{Color::white}, - option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, - option::PrefixText{"6364e0d7a283: Downloading "}}; + auto bar4 = std::make_unique(option::BarWidth{50}, + option::ForegroundColor{Color::white}, + option::ShowElapsedTime{true}, + option::ShowRemainingTime{true}, + option::PrefixText{"6364e0d7a283: Downloading "}, + indicators::option::FontStyles{ + std::vector{indicators::FontStyle::bold}}); - ProgressBar bar5{option::BarWidth{50}, option::ForegroundColor{Color::blue}, - option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, - option::PrefixText{"ff1356ba118b: Downloading "}}; + auto bar5 = std::make_unique(option::BarWidth{50}, + option::ForegroundColor{Color::blue}, + option::ShowElapsedTime{true}, + option::ShowRemainingTime{true}, + option::PrefixText{"ff1356ba118b: Downloading "}, + indicators::option::FontStyles{ + std::vector{indicators::FontStyle::bold}}); - ProgressBar bar6{option::BarWidth{50}, option::ForegroundColor{Color::cyan}, - option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, - option::PrefixText{"5a17453338b4: Downloading "}}; + auto bar6 = std::make_unique(option::BarWidth{50}, + option::ForegroundColor{Color::cyan}, + option::ShowElapsedTime{true}, + option::ShowRemainingTime{true}, + option::PrefixText{"5a17453338b4: Downloading "}, + indicators::option::FontStyles{ + std::vector{indicators::FontStyle::bold}}); std::cout << termcolor::bold << termcolor::white << "Pulling image foo:bar/baz\n"; // Construct with 3 progress bars. We'll add 3 more at a later point DynamicProgress bars(bar1, bar2, bar3); - + // Do not hide bars when completed bars.set_option(option::HideBarWhenComplete{false}); @@ -518,7 +542,7 @@ int main() { if (bars[0].is_completed()) { bars[0].set_option(option::PrefixText{"5c90d4a2d1a8: Pull complete "}); // bar1 is completed, adding bar6 - auto i = bars.push_back(bar6); + auto i = bars.push_back(std::move(bar6)); sixth_job = std::thread(job6, i); sixth_job.join(); break; @@ -533,7 +557,7 @@ int main() { if (bars[1].is_completed()) { bars[1].set_option(option::PrefixText{"22337bfd13a9: Pull complete "}); // bar2 is completed, adding bar5 - auto i = bars.push_back(bar5); + auto i = bars.push_back(std::move(bar5)); fifth_job = std::thread(job5, i); fifth_job.join(); break; @@ -548,7 +572,7 @@ int main() { if (bars[2].is_completed()) { bars[2].set_option(option::PrefixText{"10f26c680a34: Pull complete "}); // bar3 is completed, adding bar4 - auto i = bars.push_back(bar4); + auto i = bars.push_back(std::move(bar4)); fourth_job = std::thread(job4, i); fourth_job.join(); break; diff --git a/include/indicators/dynamic_progress.hpp b/include/indicators/dynamic_progress.hpp index 49d7d89..7e50ff6 100644 --- a/include/indicators/dynamic_progress.hpp +++ b/include/indicators/dynamic_progress.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -19,10 +20,10 @@ template class DynamicProgress { using Settings = std::tuple; public: - template explicit DynamicProgress(Indicators &... bars) { - bars_ = {bars...}; + template explicit DynamicProgress(Indicators &&... bars) { + (bars_.emplace_back(std::move(bars)), ...); for (auto &bar : bars_) { - bar.get().multi_progress_mode_ = true; + bar->multi_progress_mode_ = true; ++total_count_; ++incomplete_count_; } @@ -31,13 +32,13 @@ public: Indicator &operator[](size_t index) { print_progress(); std::lock_guard lock{mutex_}; - return bars_[index].get(); + return *bars_[index]; } - size_t push_back(Indicator &bar) { + size_t push_back(std::unique_ptr bar) { std::lock_guard lock{mutex_}; - bar.multi_progress_mode_ = true; - bars_.push_back(bar); + bar->multi_progress_mode_ = true; + bars_.push_back(std::move(bar)); return bars_.size() - 1; } @@ -63,7 +64,7 @@ private: Settings settings_; std::atomic started_{false}; std::mutex mutex_; - std::vector> bars_; + std::vector> bars_; std::atomic total_count_{0}; std::atomic incomplete_count_{0}; @@ -93,8 +94,8 @@ public: } incomplete_count_ = 0; for (auto &bar : bars_) { - if (!bar.get().is_completed()) { - bar.get().print_progress(true); + if (!bar->is_completed()) { + bar->print_progress(true); std::cout << "\n"; ++incomplete_count_; } @@ -106,7 +107,7 @@ public: if (started_) move_up(static_cast(total_count_)); for (auto &bar : bars_) { - bar.get().print_progress(true); + bar->print_progress(true); std::cout << "\n"; } if (!started_) @@ -119,4 +120,4 @@ public: } // namespace indicators -#endif \ No newline at end of file +#endif diff --git a/samples/dynamic_progress.cpp b/samples/dynamic_progress.cpp index e27ff13..c69d814 100644 --- a/samples/dynamic_progress.cpp +++ b/samples/dynamic_progress.cpp @@ -4,57 +4,60 @@ using namespace indicators; int main() { - ProgressBar bar1{option::BarWidth{50}, + auto bar1 = std::make_unique(option::BarWidth{50}, option::ForegroundColor{Color::red}, option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::PrefixText{"5c90d4a2d1a8: Downloading "}, indicators::option::FontStyles{ - std::vector{indicators::FontStyle::bold}}}; + std::vector{indicators::FontStyle::bold}}); - ProgressBar bar2{option::BarWidth{50}, + auto bar2 = std::make_unique(option::BarWidth{50}, option::ForegroundColor{Color::yellow}, option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::PrefixText{"22337bfd13a9: Downloading "}, indicators::option::FontStyles{ - std::vector{indicators::FontStyle::bold}}}; + std::vector{indicators::FontStyle::bold}}); - ProgressBar bar3{option::BarWidth{50}, + auto bar3 = std::make_unique(option::BarWidth{50}, option::ForegroundColor{Color::green}, option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::PrefixText{"10f26c680a34: Downloading "}, indicators::option::FontStyles{ - std::vector{indicators::FontStyle::bold}}}; + std::vector{indicators::FontStyle::bold}}); - ProgressBar bar4{option::BarWidth{50}, + auto bar4 = std::make_unique(option::BarWidth{50}, option::ForegroundColor{Color::white}, option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::PrefixText{"6364e0d7a283: Downloading "}, indicators::option::FontStyles{ - std::vector{indicators::FontStyle::bold}}}; + std::vector{indicators::FontStyle::bold}}); - ProgressBar bar5{option::BarWidth{50}, + auto bar5 = std::make_unique(option::BarWidth{50}, option::ForegroundColor{Color::blue}, option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::PrefixText{"ff1356ba118b: Downloading "}, indicators::option::FontStyles{ - std::vector{indicators::FontStyle::bold}}}; + std::vector{indicators::FontStyle::bold}}); - ProgressBar bar6{option::BarWidth{50}, + auto bar6 = std::make_unique(option::BarWidth{50}, option::ForegroundColor{Color::cyan}, option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::PrefixText{"5a17453338b4: Downloading "}, indicators::option::FontStyles{ - std::vector{indicators::FontStyle::bold}}}; + std::vector{indicators::FontStyle::bold}}); std::cout << termcolor::bold << termcolor::white << "Pulling image foo:bar/baz\n"; + // Construct with 3 progress bars. We'll add 3 more at a later point DynamicProgress bars(bar1, bar2, bar3); + + // Do not hide bars when completed bars.set_option(option::HideBarWhenComplete{false}); std::thread fourth_job, fifth_job, sixth_job; @@ -101,7 +104,7 @@ int main() { if (bars[0].is_completed()) { bars[0].set_option(option::PrefixText{"5c90d4a2d1a8: Pull complete "}); // bar1 is completed, adding bar6 - auto i = bars.push_back(bar6); + auto i = bars.push_back(std::move(bar6)); sixth_job = std::thread(job6, i); sixth_job.join(); break; @@ -116,7 +119,7 @@ int main() { if (bars[1].is_completed()) { bars[1].set_option(option::PrefixText{"22337bfd13a9: Pull complete "}); // bar2 is completed, adding bar5 - auto i = bars.push_back(bar5); + auto i = bars.push_back(std::move(bar5)); fifth_job = std::thread(job5, i); fifth_job.join(); break; @@ -131,7 +134,7 @@ int main() { if (bars[2].is_completed()) { bars[2].set_option(option::PrefixText{"10f26c680a34: Pull complete "}); // bar3 is completed, adding bar4 - auto i = bars.push_back(bar4); + auto i = bars.push_back(std::move(bar4)); fourth_job = std::thread(job4, i); fourth_job.join(); break;