| 2304 | namespace indicators { |
| 2305 | |
| 2306 | class BlockProgressBar { |
| 2307 | using Settings = std::tuple<option::ForegroundColor, option::BarWidth, option::Start, option::End, |
| 2308 | option::PrefixText, option::PostfixText, option::ShowPercentage, |
| 2309 | option::ShowElapsedTime, option::ShowRemainingTime, option::Completed, |
| 2310 | option::SavedStartTime, option::MaxPostfixTextLen, option::FontStyles, |
| 2311 | option::MaxProgress, option::Stream>; |
| 2312 | |
| 2313 | public: |
| 2314 | template <typename... Args, |
| 2315 | typename std::enable_if<details::are_settings_from_tuple< |
| 2316 | Settings, typename std::decay<Args>::type...>::value, |
| 2317 | void *>::type = nullptr> |
| 2318 | explicit BlockProgressBar(Args &&... args) |
| 2319 | : settings_(details::get<details::ProgressBarOption::foreground_color>( |
| 2320 | option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...), |
| 2321 | details::get<details::ProgressBarOption::bar_width>(option::BarWidth{100}, |
| 2322 | std::forward<Args>(args)...), |
| 2323 | details::get<details::ProgressBarOption::start>(option::Start{"["}, |
| 2324 | std::forward<Args>(args)...), |
| 2325 | details::get<details::ProgressBarOption::end>(option::End{"]"}, |
| 2326 | std::forward<Args>(args)...), |
| 2327 | details::get<details::ProgressBarOption::prefix_text>( |
| 2328 | option::PrefixText{""}, std::forward<Args>(args)...), |
| 2329 | details::get<details::ProgressBarOption::postfix_text>( |
| 2330 | option::PostfixText{""}, std::forward<Args>(args)...), |
| 2331 | details::get<details::ProgressBarOption::show_percentage>( |
| 2332 | option::ShowPercentage{true}, std::forward<Args>(args)...), |
| 2333 | details::get<details::ProgressBarOption::show_elapsed_time>( |
| 2334 | option::ShowElapsedTime{false}, std::forward<Args>(args)...), |
| 2335 | details::get<details::ProgressBarOption::show_remaining_time>( |
| 2336 | option::ShowRemainingTime{false}, std::forward<Args>(args)...), |
| 2337 | details::get<details::ProgressBarOption::completed>(option::Completed{false}, |
| 2338 | std::forward<Args>(args)...), |
| 2339 | details::get<details::ProgressBarOption::saved_start_time>( |
| 2340 | option::SavedStartTime{false}, std::forward<Args>(args)...), |
| 2341 | details::get<details::ProgressBarOption::max_postfix_text_len>( |
| 2342 | option::MaxPostfixTextLen{0}, std::forward<Args>(args)...), |
| 2343 | details::get<details::ProgressBarOption::font_styles>( |
| 2344 | option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), |
| 2345 | details::get<details::ProgressBarOption::max_progress>( |
| 2346 | option::MaxProgress{100}, std::forward<Args>(args)...), |
| 2347 | details::get<details::ProgressBarOption::stream>(option::Stream{std::cout}, |
| 2348 | std::forward<Args>(args)...)) {} |
| 2349 | |
| 2350 | template <typename T, details::ProgressBarOption id> |
| 2351 | void set_option(details::Setting<T, id> &&setting) { |
| 2352 | static_assert(!std::is_same<T, typename std::decay<decltype(details::get_value<id>( |
| 2353 | std::declval<Settings>()))>::type>::value, |
| 2354 | "Setting has wrong type!"); |
| 2355 | std::lock_guard<std::mutex> lock(mutex_); |
| 2356 | get_value<id>() = std::move(setting).value; |
| 2357 | } |
| 2358 | |
| 2359 | template <typename T, details::ProgressBarOption id> |
| 2360 | void set_option(const details::Setting<T, id> &setting) { |
| 2361 | static_assert(!std::is_same<T, typename std::decay<decltype(details::get_value<id>( |
| 2362 | std::declval<Settings>()))>::type>::value, |
| 2363 | "Setting has wrong type!"); |
nothing calls this directly
no outgoing calls
no test coverage detected