1#ifndef TATOOINE_PROGRESS_BARS_H
2#define TATOOINE_PROGRESS_BARS_H
5#include <indicators/block_progress_bar.hpp>
6#include <indicators/indeterminate_progress_bar.hpp>
10template <
typename Indicator>
12 requires(Indicator indicator,
double p) { indicator.set_progress(p); };
17 indicator.set_option(indicators::option::PostfixText{msg});
21 indicator.set_option(indicators::option::PostfixText{msg});
24 auto set_text(std::string
const &text) ->
void {
25 indicator.set_option(indicators::option::PostfixText{text});
34 indicator.set_option(indicators::option::PostfixText{msg});
39 indicator.set_option(indicators::option::PostfixText{msg});
43 auto set_text(std::string
const &text) ->
void {
44 indicator.set_option(indicators::option::PostfixText{text});
49 using namespace indicators;
50 return IndeterminateProgressBar{
54 option::Lead{
"░▒▓▒░"},
56 option::ForegroundColor{Color::white},
57 option::FontStyles{std::vector<FontStyle>{FontStyle::bold}}};
61 return std::thread{[&indicator]() {
62 while (!indicator.is_completed()) {
64 std::this_thread::sleep_for(std::chrono::milliseconds(100));
70template <
typename F,
typename... Args>
76 if constexpr (is_void<return_type>) {
77 f(std::forward<Args>(args)...);
78 indicator.mark_as_completed();
79 job_completion_thread.join();
81 decltype(
auto) ret = f(std::forward<Args>(args)...);
82 indicator.mark_as_completed();
83 job_completion_thread.join();
88template <
typename F,
typename... Args>
89 requires is_invocable<F, indicator_msg<indicators::IndeterminateProgressBar>,
92 F, indicator_msg<indicators::IndeterminateProgressBar>, Args...>>
98 std::forward<Args>(args)...);
99 indicator.mark_as_completed();
100 job_completion_thread.join();
103template <
typename F,
typename... Args>
104 requires is_invocable<F, indicator_msg<indicators::IndeterminateProgressBar>,
107 F, indicator_msg<indicators::IndeterminateProgressBar>,
111 using namespace indicators;
120 std::forward<Args>(args)...);
121 indicator.mark_as_completed();
122 job_completion_thread.join();
126template <
typename F,
typename... Args>
127 requires std::invocable<
128 F, progress_indicator_wrapper<indicators::BlockProgressBar>,
131 indicators::BlockProgressBar progress_indicator{
132 indicators::option::BarWidth{20},
135 indicators::option::ShowElapsedTime{
true},
136 indicators::option::ShowRemainingTime{
true},
137 indicators::option::ForegroundColor{indicators::Color::white},
138 indicators::option::FontStyles{
139 std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
140 auto progress =
double{};
142 progress_indicator, progress};
144 auto job_completion_thread = std::thread{[&progress_indicator, &progress] {
145 while (progress < 1) {
146 progress_indicator.set_progress(100 * progress);
147 std::this_thread::sleep_for(std::chrono::milliseconds(100));
149 progress_indicator.set_progress(100);
154 if constexpr (is_void<return_type>) {
155 f(std::forward<Args>(args)...);
156 wrapper.progress = 100;
157 job_completion_thread.join();
159 decltype(
auto) ret = f(std::forward<Args>(args)...);
160 wrapper.progress = 100;
161 job_completion_thread.join();
166 indicators::BlockProgressBar>,
170 if constexpr (is_void<return_type>) {
171 f(wrapper, std::forward<Args>(args)...);
172 wrapper.progress = 100;
173 job_completion_thread.join();
175 decltype(
auto) ret = f(wrapper, std::forward<Args>(args)...);
176 wrapper.progress = 100;
177 job_completion_thread.join();
Definition: progress_bars.h:11
Definition: algorithm.h:6
auto indeterminate_progress_bar(F &&f, Args &&...args) -> decltype(auto)
Definition: progress_bars.h:72
static constexpr auto is_void
Definition: type_traits.h:45
std::invoke_result_t< F, Args... > invoke_result
Definition: concepts.h:127
auto make_default_indeterminate_progress_bar()
Definition: progress_bars.h:48
auto make_indeterminate_completion_thread(auto &indicator)
Definition: progress_bars.h:60
static constexpr auto is_invocable
Definition: type_traits.h:66
auto progress_bar(F &&f, Args &&...args) -> decltype(auto)
Definition: progress_bars.h:130
Definition: progress_bars.h:14
auto operator=(std::string const &msg) -> indicator_msg &
Definition: progress_bars.h:20
auto mark_as_completed() -> void
Definition: progress_bars.h:27
Indicator & indicator
Definition: progress_bars.h:15
auto operator=(char const *msg) -> indicator_msg &
Definition: progress_bars.h:16
auto set_text(std::string const &text) -> void
Definition: progress_bars.h:24
Definition: progress_bars.h:29
auto operator=(char const *msg) -> progress_indicator_wrapper &
Definition: progress_bars.h:33
auto operator=(std::string const &msg) -> progress_indicator_wrapper &
Definition: progress_bars.h:38
auto set_text(std::string const &text) -> void
Definition: progress_bars.h:43
double & progress
Definition: progress_bars.h:31
Indicator & indicator
Definition: progress_bars.h:30