#ifndef INDICATORS_MULTI_PROGRESS #define INDICATORS_MULTI_PROGRESS #include #include #include #include #include #include #include #include namespace indicators { template class MultiProgress { public: template ::type> explicit MultiProgress(Indicators &... bars) { bars_ = {bars...}; for (auto &bar : bars_) { bar.get().multi_progress_mode_ = true; } } template typename std::enable_if<(index >= 0 && index < count), void>::type set_progress(size_t value) { if (!bars_[index].get().is_completed()) bars_[index].get().set_progress(value); print_progress(); } template typename std::enable_if<(index >= 0 && index < count), void>::type set_progress(float value) { if (!bars_[index].get().is_completed()) bars_[index].get().set_progress(value); print_progress(); } template typename std::enable_if<(index >= 0 && index < count), void>::type tick() { if (!bars_[index].get().is_completed()) bars_[index].get().tick(); print_progress(); } template typename std::enable_if<(index >= 0 && index < count), bool>::type is_completed() const { return bars_[index].get().is_completed(); } private: std::atomic started_{false}; std::mutex mutex_; std::vector> bars_; bool _all_completed() { bool result{true}; for (size_t i = 0; i < count; ++i) result &= bars_[i].get().is_completed(); return result; } public: void print_progress() { std::lock_guard lock{mutex_}; if (started_) move_up(count); for (auto &bar : bars_) { bar.get().print_progress(true); std::cout << "\n"; } std::cout << termcolor::reset; if (!started_) started_ = true; } }; } // namespace indicators #endif