| 2829 | namespace indicators { |
| 2830 | |
| 2831 | template <typename Indicator, size_t count> class MultiProgress { |
| 2832 | public: |
| 2833 | template <typename... Indicators, |
| 2834 | typename = typename std::enable_if<(sizeof...(Indicators) == count)>::type> |
| 2835 | explicit MultiProgress(Indicators &... bars) { |
| 2836 | bars_ = {bars...}; |
| 2837 | for (auto &bar : bars_) { |
| 2838 | bar.get().multi_progress_mode_ = true; |
| 2839 | } |
| 2840 | } |
| 2841 | |
| 2842 | template <size_t index> |
| 2843 | typename std::enable_if<(index >= 0 && index < count), void>::type set_progress(size_t value) { |
| 2844 | if (!bars_[index].get().is_completed()) |
| 2845 | bars_[index].get().set_progress(value); |
| 2846 | print_progress(); |
| 2847 | } |
| 2848 | |
| 2849 | template <size_t index> |
| 2850 | typename std::enable_if<(index >= 0 && index < count), void>::type set_progress(float value) { |
| 2851 | if (!bars_[index].get().is_completed()) |
| 2852 | bars_[index].get().set_progress(value); |
| 2853 | print_progress(); |
| 2854 | } |
| 2855 | |
| 2856 | template <size_t index> |
| 2857 | typename std::enable_if<(index >= 0 && index < count), void>::type tick() { |
| 2858 | if (!bars_[index].get().is_completed()) |
| 2859 | bars_[index].get().tick(); |
| 2860 | print_progress(); |
| 2861 | } |
| 2862 | |
| 2863 | template <size_t index> |
| 2864 | typename std::enable_if<(index >= 0 && index < count), bool>::type is_completed() const { |
| 2865 | return bars_[index].get().is_completed(); |
| 2866 | } |
| 2867 | |
| 2868 | private: |
| 2869 | std::atomic<bool> started_{false}; |
| 2870 | std::mutex mutex_; |
| 2871 | std::vector<std::reference_wrapper<Indicator>> bars_; |
| 2872 | |
| 2873 | bool _all_completed() { |
| 2874 | bool result{true}; |
| 2875 | for (size_t i = 0; i < count; ++i) |
| 2876 | result &= bars_[i].get().is_completed(); |
| 2877 | return result; |
| 2878 | } |
| 2879 | |
| 2880 | public: |
| 2881 | void print_progress() { |
| 2882 | std::lock_guard<std::mutex> lock{mutex_}; |
| 2883 | if (started_) |
| 2884 | move_up(count); |
| 2885 | for (auto &bar : bars_) { |
| 2886 | bar.get().print_progress(true); |
| 2887 | std::cout << "\n"; |
| 2888 | } |
nothing calls this directly
no outgoing calls
no test coverage detected