| 3042 | namespace indicators { |
| 3043 | |
| 3044 | class ProgressSpinner { |
| 3045 | using Settings = |
| 3046 | std::tuple<option::ForegroundColor, option::PrefixText, option::PostfixText, |
| 3047 | option::ShowPercentage, option::ShowElapsedTime, option::ShowRemainingTime, |
| 3048 | option::ShowSpinner, option::SavedStartTime, option::Completed, |
| 3049 | option::MaxPostfixTextLen, option::SpinnerStates, option::FontStyles, |
| 3050 | option::MaxProgress, option::Stream>; |
| 3051 | |
| 3052 | public: |
| 3053 | template <typename... Args, |
| 3054 | typename std::enable_if<details::are_settings_from_tuple< |
| 3055 | Settings, typename std::decay<Args>::type...>::value, |
| 3056 | void *>::type = nullptr> |
| 3057 | explicit ProgressSpinner(Args &&... args) |
| 3058 | : settings_( |
| 3059 | details::get<details::ProgressBarOption::foreground_color>( |
| 3060 | option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...), |
| 3061 | details::get<details::ProgressBarOption::prefix_text>(option::PrefixText{}, |
| 3062 | std::forward<Args>(args)...), |
| 3063 | details::get<details::ProgressBarOption::postfix_text>(option::PostfixText{}, |
| 3064 | std::forward<Args>(args)...), |
| 3065 | details::get<details::ProgressBarOption::show_percentage>(option::ShowPercentage{true}, |
| 3066 | std::forward<Args>(args)...), |
| 3067 | details::get<details::ProgressBarOption::show_elapsed_time>( |
| 3068 | option::ShowElapsedTime{false}, std::forward<Args>(args)...), |
| 3069 | details::get<details::ProgressBarOption::show_remaining_time>( |
| 3070 | option::ShowRemainingTime{false}, std::forward<Args>(args)...), |
| 3071 | details::get<details::ProgressBarOption::spinner_show>(option::ShowSpinner{true}, |
| 3072 | std::forward<Args>(args)...), |
| 3073 | details::get<details::ProgressBarOption::saved_start_time>( |
| 3074 | option::SavedStartTime{false}, std::forward<Args>(args)...), |
| 3075 | details::get<details::ProgressBarOption::completed>(option::Completed{false}, |
| 3076 | std::forward<Args>(args)...), |
| 3077 | details::get<details::ProgressBarOption::max_postfix_text_len>( |
| 3078 | option::MaxPostfixTextLen{0}, std::forward<Args>(args)...), |
| 3079 | details::get<details::ProgressBarOption::spinner_states>( |
| 3080 | option::SpinnerStates{ |
| 3081 | std::vector<std::string>{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"}}, |
| 3082 | std::forward<Args>(args)...), |
| 3083 | details::get<details::ProgressBarOption::font_styles>( |
| 3084 | option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), |
| 3085 | details::get<details::ProgressBarOption::max_progress>(option::MaxProgress{100}, |
| 3086 | std::forward<Args>(args)...), |
| 3087 | details::get<details::ProgressBarOption::stream>(option::Stream{std::cout}, |
| 3088 | std::forward<Args>(args)...)) {} |
| 3089 | |
| 3090 | template <typename T, details::ProgressBarOption id> |
| 3091 | void set_option(details::Setting<T, id> &&setting) { |
| 3092 | static_assert(!std::is_same<T, typename std::decay<decltype(details::get_value<id>( |
| 3093 | std::declval<Settings>()))>::type>::value, |
| 3094 | "Setting has wrong type!"); |
| 3095 | std::lock_guard<std::mutex> lock(mutex_); |
| 3096 | get_value<id>() = std::move(setting).value; |
| 3097 | } |
| 3098 | |
| 3099 | template <typename T, details::ProgressBarOption id> |
| 3100 | void set_option(const details::Setting<T, id> &setting) { |
| 3101 | static_assert(!std::is_same<T, typename std::decay<decltype(details::get_value<id>( |
nothing calls this directly
no outgoing calls
no test coverage detected