Clang format

This commit is contained in:
Pranav Srinivas Kumar
2020-05-24 22:56:57 -05:00
parent e5cc05a62d
commit a2e11d4707
25 changed files with 776 additions and 924 deletions

View File

@@ -1,6 +1,6 @@
#include <indicators/cursor_control.hpp>
#include <indicators/progress_bar.hpp> #include <indicators/progress_bar.hpp>
#include <indicators/progress_spinner.hpp> #include <indicators/progress_spinner.hpp>
#include <indicators/cursor_control.hpp>
#include <vector> #include <vector>
int main() { int main() {
@@ -13,15 +13,15 @@ int main() {
// //
// PROGRESS BAR 1 // PROGRESS BAR 1
// //
indicators::ProgressBar p{option::BarWidth{50}, indicators::ProgressBar p{
option::Start{"["}, option::BarWidth{50},
option::Fill{""}, option::Start{"["},
option::Lead{""}, option::Fill{""},
option::Remainder{" "}, option::Lead{""},
option::End{" ]"}, option::Remainder{" "},
option::ForegroundColor{indicators::Color::yellow}, option::End{" ]"},
option::FontStyles{ option::ForegroundColor{indicators::Color::yellow},
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
std::atomic<size_t> index{0}; std::atomic<size_t> index{0};
std::vector<std::string> status_text = {"Rocket.exe is not responding", std::vector<std::string> status_text = {"Rocket.exe is not responding",
@@ -62,7 +62,8 @@ int main() {
p.set_option(option::End{""}); p.set_option(option::End{""});
p.set_option(option::ForegroundColor{indicators::Color::white}); p.set_option(option::ForegroundColor{indicators::Color::white});
p.set_option(option::ShowPercentage{false}); p.set_option(option::ShowPercentage{false});
p.set_option(option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}); p.set_option(
option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
auto job = [&p]() { auto job = [&p]() {
while (true) { while (true) {
p.set_option( p.set_option(
@@ -93,7 +94,8 @@ int main() {
p.set_option(option::End{"]"}); p.set_option(option::End{"]"});
p.set_option(option::PostfixText{"Getting started"}); p.set_option(option::PostfixText{"Getting started"});
p.set_option(option::ForegroundColor{indicators::Color::green}); p.set_option(option::ForegroundColor{indicators::Color::green});
p.set_option(option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}); p.set_option(
option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
auto job = [&p]() { auto job = [&p]() {
while (true) { while (true) {
auto ticks = p.current(); auto ticks = p.current();
@@ -130,7 +132,8 @@ int main() {
p4.set_option(option::ForegroundColor{indicators::Color::cyan}); p4.set_option(option::ForegroundColor{indicators::Color::cyan});
p4.set_option(option::PostfixText{"Restoring system state"}); p4.set_option(option::PostfixText{"Restoring system state"});
p4.set_option(option::ShowPercentage{false}); p4.set_option(option::ShowPercentage{false});
p4.set_option(option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}); p4.set_option(
option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}});
std::atomic<size_t> index4{0}; std::atomic<size_t> index4{0};
auto job4 = [&p4, &index4, &lead_spinner]() { auto job4 = [&p4, &index4, &lead_spinner]() {
while (true) { while (true) {
@@ -164,17 +167,17 @@ int main() {
// //
// GOING BACKWARDS // GOING BACKWARDS
// //
indicators::ProgressBar p{option::BarWidth{50}, indicators::ProgressBar p{
option::ProgressType{ProgressType::decremental}, option::BarWidth{50},
option::Start{"["}, option::ProgressType{ProgressType::decremental},
option::Fill{""}, option::Start{"["},
option::Lead{""}, option::Fill{""},
option::Remainder{"-"}, option::Lead{""},
option::End{"]"}, option::Remainder{"-"},
option::ForegroundColor{indicators::Color::white}, option::End{"]"},
option::PostfixText{"Reverting system restore"}, option::ForegroundColor{indicators::Color::white},
option::FontStyles{ option::PostfixText{"Reverting system restore"},
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
auto job = [&p]() { auto job = [&p]() {
while (true) { while (true) {
p.tick(); p.tick();
@@ -225,8 +228,10 @@ int main() {
// PROGRESS BAR 6 // PROGRESS BAR 6
// //
indicators::ProgressSpinner p{ indicators::ProgressSpinner p{
option::PrefixText{" - "}, option::PostfixText{"Searching for the Moon"}, option::PrefixText{" - "},
option::ForegroundColor{indicators::Color::white}, option::ShowPercentage{false}, option::PostfixText{"Searching for the Moon"},
option::ForegroundColor{indicators::Color::white},
option::ShowPercentage{false},
option::SpinnerStates{std::vector<std::string>{"", "", "", ""}}, option::SpinnerStates{std::vector<std::string>{"", "", "", ""}},
option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
auto job = [&p]() { auto job = [&p]() {
@@ -264,17 +269,17 @@ int main() {
// //
// NESTED PROGRESS BAR // NESTED PROGRESS BAR
// //
indicators::ProgressBar p2{option::BarWidth{30}, indicators::ProgressBar p2{
option::PrefixText{" - "}, option::BarWidth{30},
option::Start{"🌎"}, option::PrefixText{" - "},
option::Fill{"·"}, option::Start{"🌎"},
option::Lead{"🚀"}, option::Fill{"·"},
option::Remainder{" "}, option::Lead{"🚀"},
option::End{"🌑"}, option::Remainder{" "},
option::PostfixText{"Achieved low-Earth orbit"}, option::End{"🌑"},
option::ForegroundColor{indicators::Color::white}, option::PostfixText{"Achieved low-Earth orbit"},
option::FontStyles{ option::ForegroundColor{indicators::Color::white},
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
std::vector<std::string> ship_trail{"", "", "", "", "", "", "", ""}; std::vector<std::string> ship_trail{"", "", "", "", "", "", "", ""};
std::atomic<int> ship_trail_index{0}; std::atomic<int> ship_trail_index{0};
auto job2 = [&p2, &ship_trail_index, &ship_trail]() { auto job2 = [&p2, &ship_trail_index, &ship_trail]() {

View File

@@ -55,11 +55,10 @@ public:
option::MaxPostfixTextLen{0}, std::forward<Args>(args)...), option::MaxPostfixTextLen{0}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::font_styles>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_progress>(option::MaxProgress{100}, details::get<details::ProgressBarOption::max_progress>(
std::forward<Args>(args)...), option::MaxProgress{100}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>( details::get<details::ProgressBarOption::stream>(option::Stream{std::cout},
option::Stream{std::cout}, std::forward<Args>(args)...) std::forward<Args>(args)...)) {}
) {}
template <typename T, details::ProgressBarOption id> template <typename T, details::ProgressBarOption id>
void set_option(details::Setting<T, id> &&setting) { void set_option(details::Setting<T, id> &&setting) {
@@ -118,7 +117,8 @@ public:
size_t current() { size_t current() {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
return std::min(static_cast<size_t>(progress_), size_t(get_value<details::ProgressBarOption::max_progress>())); return std::min(static_cast<size_t>(progress_),
size_t(get_value<details::ProgressBarOption::max_progress>()));
} }
bool is_completed() const { return get_value<details::ProgressBarOption::completed>(); } bool is_completed() const { return get_value<details::ProgressBarOption::completed>(); }
@@ -163,7 +163,7 @@ public:
void print_progress(bool from_multi_progress = false) { void print_progress(bool from_multi_progress = false) {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>(); auto &os = get_value<details::ProgressBarOption::stream>();
const auto max_progress = get_value<details::ProgressBarOption::max_progress>(); const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
if (multi_progress_mode_ && !from_multi_progress) { if (multi_progress_mode_ && !from_multi_progress) {
@@ -181,7 +181,7 @@ public:
for (auto &style : get_value<details::ProgressBarOption::font_styles>()) for (auto &style : get_value<details::ProgressBarOption::font_styles>())
details::set_font_style(os, style); details::set_font_style(os, style);
os << get_value<details::ProgressBarOption::prefix_text>(); os << get_value<details::ProgressBarOption::prefix_text>();
os << get_value<details::ProgressBarOption::start>(); os << get_value<details::ProgressBarOption::start>();
@@ -191,7 +191,8 @@ public:
os << get_value<details::ProgressBarOption::end>(); os << get_value<details::ProgressBarOption::end>();
if (get_value<details::ProgressBarOption::show_percentage>()) { if (get_value<details::ProgressBarOption::show_percentage>()) {
os << " " << std::min(static_cast<size_t>(progress_ / max_progress * 100.0), size_t(100)) << "%"; os << " " << std::min(static_cast<size_t>(progress_ / max_progress * 100.0), size_t(100))
<< "%";
} }
auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>(); auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>();
@@ -228,8 +229,7 @@ public:
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
os << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << "\r";
<< "\r";
os.flush(); os.flush();
if (progress_ > max_progress) { if (progress_ > max_progress) {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;

View File

@@ -1,8 +1,8 @@
#pragma once #pragma once
#include <indicators/display_width.hpp>
#include <indicators/setting.hpp> #include <indicators/setting.hpp>
#include <indicators/termcolor.hpp> #include <indicators/termcolor.hpp>
#include <indicators/display_width.hpp>
#include <algorithm> #include <algorithm>
#include <chrono> #include <chrono>
@@ -175,7 +175,7 @@ private:
class IndeterminateProgressScaleWriter { class IndeterminateProgressScaleWriter {
public: public:
IndeterminateProgressScaleWriter(std::ostream &os, size_t bar_width, const std::string &fill, IndeterminateProgressScaleWriter(std::ostream &os, size_t bar_width, const std::string &fill,
const std::string &lead) const std::string &lead)
: os(os), bar_width(bar_width), fill(fill), lead(lead) {} : os(os), bar_width(bar_width), fill(fill), lead(lead) {}
std::ostream &write(size_t progress) { std::ostream &write(size_t progress) {

View File

@@ -1,10 +1,10 @@
#pragma once #pragma once
#include <wchar.h>
#include <string>
#include <clocale> #include <clocale>
#include <locale>
#include <cstdlib>
#include <codecvt> #include <codecvt>
#include <cstdlib>
#include <locale>
#include <string>
#include <wchar.h>
namespace unicode { namespace unicode {
@@ -77,7 +77,7 @@ struct interval {
}; };
/* auxiliary function for binary search in interval table */ /* auxiliary function for binary search in interval table */
static inline int bisearch(wchar_t ucs, const struct interval* table, int max) { static inline int bisearch(wchar_t ucs, const struct interval *table, int max) {
int min = 0; int min = 0;
int mid; int mid;
@@ -96,7 +96,6 @@ static inline int bisearch(wchar_t ucs, const struct interval* table, int max) {
return 0; return 0;
} }
/* The following two functions define the column width of an ISO 10646 /* The following two functions define the column width of an ISO 10646
* character as follows: * character as follows:
* *
@@ -129,60 +128,46 @@ static inline int bisearch(wchar_t ucs, const struct interval* table, int max) {
* in ISO 10646. * in ISO 10646.
*/ */
static inline int mk_wcwidth(wchar_t ucs) static inline int mk_wcwidth(wchar_t ucs) {
{
/* sorted list of non-overlapping intervals of non-spacing characters */ /* sorted list of non-overlapping intervals of non-spacing characters */
/* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */
static const struct interval combining[] = { static const struct interval combining[] = {
{ 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, {0x0300, 0x036F}, {0x0483, 0x0486}, {0x0488, 0x0489}, {0x0591, 0x05BD},
{ 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, {0x05BF, 0x05BF}, {0x05C1, 0x05C2}, {0x05C4, 0x05C5}, {0x05C7, 0x05C7},
{ 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 }, {0x0600, 0x0603}, {0x0610, 0x0615}, {0x064B, 0x065E}, {0x0670, 0x0670},
{ 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 }, {0x06D6, 0x06E4}, {0x06E7, 0x06E8}, {0x06EA, 0x06ED}, {0x070F, 0x070F},
{ 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, {0x0711, 0x0711}, {0x0730, 0x074A}, {0x07A6, 0x07B0}, {0x07EB, 0x07F3},
{ 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, {0x0901, 0x0902}, {0x093C, 0x093C}, {0x0941, 0x0948}, {0x094D, 0x094D},
{ 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 }, {0x0951, 0x0954}, {0x0962, 0x0963}, {0x0981, 0x0981}, {0x09BC, 0x09BC},
{ 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, {0x09C1, 0x09C4}, {0x09CD, 0x09CD}, {0x09E2, 0x09E3}, {0x0A01, 0x0A02},
{ 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, {0x0A3C, 0x0A3C}, {0x0A41, 0x0A42}, {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D},
{ 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, {0x0A70, 0x0A71}, {0x0A81, 0x0A82}, {0x0ABC, 0x0ABC}, {0x0AC1, 0x0AC5},
{ 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, {0x0AC7, 0x0AC8}, {0x0ACD, 0x0ACD}, {0x0AE2, 0x0AE3}, {0x0B01, 0x0B01},
{ 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, {0x0B3C, 0x0B3C}, {0x0B3F, 0x0B3F}, {0x0B41, 0x0B43}, {0x0B4D, 0x0B4D},
{ 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, {0x0B56, 0x0B56}, {0x0B82, 0x0B82}, {0x0BC0, 0x0BC0}, {0x0BCD, 0x0BCD},
{ 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, {0x0C3E, 0x0C40}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, {0x0C55, 0x0C56},
{ 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, {0x0CBC, 0x0CBC}, {0x0CBF, 0x0CBF}, {0x0CC6, 0x0CC6}, {0x0CCC, 0x0CCD},
{ 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, {0x0CE2, 0x0CE3}, {0x0D41, 0x0D43}, {0x0D4D, 0x0D4D}, {0x0DCA, 0x0DCA},
{ 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, {0x0DD2, 0x0DD4}, {0x0DD6, 0x0DD6}, {0x0E31, 0x0E31}, {0x0E34, 0x0E3A},
{ 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, {0x0E47, 0x0E4E}, {0x0EB1, 0x0EB1}, {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC},
{ 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, {0x0EC8, 0x0ECD}, {0x0F18, 0x0F19}, {0x0F35, 0x0F35}, {0x0F37, 0x0F37},
{ 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, {0x0F39, 0x0F39}, {0x0F71, 0x0F7E}, {0x0F80, 0x0F84}, {0x0F86, 0x0F87},
{ 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, {0x0F90, 0x0F97}, {0x0F99, 0x0FBC}, {0x0FC6, 0x0FC6}, {0x102D, 0x1030},
{ 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, {0x1032, 0x1032}, {0x1036, 0x1037}, {0x1039, 0x1039}, {0x1058, 0x1059},
{ 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, {0x1160, 0x11FF}, {0x135F, 0x135F}, {0x1712, 0x1714}, {0x1732, 0x1734},
{ 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, {0x1752, 0x1753}, {0x1772, 0x1773}, {0x17B4, 0x17B5}, {0x17B7, 0x17BD},
{ 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, {0x17C6, 0x17C6}, {0x17C9, 0x17D3}, {0x17DD, 0x17DD}, {0x180B, 0x180D},
{ 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, {0x18A9, 0x18A9}, {0x1920, 0x1922}, {0x1927, 0x1928}, {0x1932, 0x1932},
{ 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, {0x1939, 0x193B}, {0x1A17, 0x1A18}, {0x1B00, 0x1B03}, {0x1B34, 0x1B34},
{ 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, {0x1B36, 0x1B3A}, {0x1B3C, 0x1B3C}, {0x1B42, 0x1B42}, {0x1B6B, 0x1B73},
{ 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, {0x1DC0, 0x1DCA}, {0x1DFE, 0x1DFF}, {0x200B, 0x200F}, {0x202A, 0x202E},
{ 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F }, {0x2060, 0x2063}, {0x206A, 0x206F}, {0x20D0, 0x20EF}, {0x302A, 0x302F},
{ 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, {0x3099, 0x309A}, {0xA806, 0xA806}, {0xA80B, 0xA80B}, {0xA825, 0xA826},
{ 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, {0xFB1E, 0xFB1E}, {0xFE00, 0xFE0F}, {0xFE20, 0xFE23}, {0xFEFF, 0xFEFF},
{ 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, {0xFFF9, 0xFFFB}, {0x10A01, 0x10A03}, {0x10A05, 0x10A06}, {0x10A0C, 0x10A0F},
{ 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, {0x10A38, 0x10A3A}, {0x10A3F, 0x10A3F}, {0x1D167, 0x1D169}, {0x1D173, 0x1D182},
{ 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, {0x1D185, 0x1D18B}, {0x1D1AA, 0x1D1AD}, {0x1D242, 0x1D244}, {0xE0001, 0xE0001},
{ 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, {0xE0020, 0xE007F}, {0xE0100, 0xE01EF}};
{ 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 },
{ 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF },
{ 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 },
{ 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F },
{ 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B },
{ 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F },
{ 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB },
{ 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F },
{ 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 },
{ 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD },
{ 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F },
{ 0xE0100, 0xE01EF }
};
/* test for 8-bit control characters */ /* test for 8-bit control characters */
if (ucs == 0) if (ucs == 0)
@@ -191,30 +176,25 @@ static inline int mk_wcwidth(wchar_t ucs)
return -1; return -1;
/* binary search in table of non-spacing characters */ /* binary search in table of non-spacing characters */
if (bisearch(ucs, combining, if (bisearch(ucs, combining, sizeof(combining) / sizeof(struct interval) - 1))
sizeof(combining) / sizeof(struct interval) - 1))
return 0; return 0;
/* if we arrive here, ucs is not a combining or C0/C1 control character */ /* if we arrive here, ucs is not a combining or C0/C1 control character */
return 1 + return 1 + (ucs >= 0x1100 &&
(ucs >= 0x1100 && (ucs <= 0x115f || /* Hangul Jamo init. consonants */
(ucs <= 0x115f || /* Hangul Jamo init. consonants */ ucs == 0x2329 || ucs == 0x232a ||
ucs == 0x2329 || ucs == 0x232a || (ucs >= 0x2e80 && ucs <= 0xa4cf && ucs != 0x303f) || /* CJK ... Yi */
(ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */
ucs != 0x303f) || /* CJK ... Yi */ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */
(ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */
(ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */
(ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */ (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */
(ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ (ucs >= 0xffe0 && ucs <= 0xffe6) || (ucs >= 0x20000 && ucs <= 0x2fffd) ||
(ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */ (ucs >= 0x30000 && ucs <= 0x3fffd)));
(ucs >= 0xffe0 && ucs <= 0xffe6) ||
(ucs >= 0x20000 && ucs <= 0x2fffd) ||
(ucs >= 0x30000 && ucs <= 0x3fffd)));
} }
static inline int mk_wcswidth(const wchar_t* pwcs, size_t n) static inline int mk_wcswidth(const wchar_t *pwcs, size_t n) {
{
int w, width = 0; int w, width = 0;
for (; *pwcs && n-- > 0; pwcs++) for (; *pwcs && n-- > 0; pwcs++)
@@ -226,7 +206,6 @@ static inline int mk_wcswidth(const wchar_t* pwcs, size_t n)
return width; return width;
} }
/* /*
* The following functions are the same as mk_wcwidth() and * The following functions are the same as mk_wcwidth() and
* mk_wcswidth(), except that spacing characters in the East Asian * mk_wcswidth(), except that spacing characters in the East Asian
@@ -236,75 +215,51 @@ static inline int mk_wcswidth(const wchar_t* pwcs, size_t n)
* the traditional terminal character-width behaviour. It is not * the traditional terminal character-width behaviour. It is not
* otherwise recommended for general use. * otherwise recommended for general use.
*/ */
static inline int mk_wcwidth_cjk(wchar_t ucs) static inline int mk_wcwidth_cjk(wchar_t ucs) {
{
/* sorted list of non-overlapping intervals of East Asian Ambiguous /* sorted list of non-overlapping intervals of East Asian Ambiguous
* characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */ * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */
static const struct interval ambiguous[] = { static const struct interval ambiguous[] = {
{ 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8}, {0x00AA, 0x00AA}, {0x00AE, 0x00AE},
{ 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 }, {0x00B0, 0x00B4}, {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6}, {0x00D0, 0x00D0},
{ 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, {0x00D7, 0x00D8}, {0x00DE, 0x00E1}, {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED},
{ 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA}, {0x00FC, 0x00FC}, {0x00FE, 0x00FE},
{ 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, {0x0101, 0x0101}, {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B}, {0x0126, 0x0127},
{ 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, {0x012B, 0x012B}, {0x0131, 0x0133}, {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144},
{ 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, {0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153}, {0x0166, 0x0167}, {0x016B, 0x016B},
{ 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, {0x01CE, 0x01CE}, {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4}, {0x01D6, 0x01D6},
{ 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, {0x01D8, 0x01D8}, {0x01DA, 0x01DA}, {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261},
{ 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB}, {0x02CD, 0x02CD}, {0x02D0, 0x02D0},
{ 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, {0x02D8, 0x02DB}, {0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0391, 0x03A1}, {0x03A3, 0x03A9},
{ 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, {0x03B1, 0x03C1}, {0x03C3, 0x03C9}, {0x0401, 0x0401}, {0x0410, 0x044F}, {0x0451, 0x0451},
{ 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, {0x2010, 0x2010}, {0x2013, 0x2016}, {0x2018, 0x2019}, {0x201C, 0x201D}, {0x2020, 0x2022},
{ 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, {0x2024, 0x2027}, {0x2030, 0x2030}, {0x2032, 0x2033}, {0x2035, 0x2035}, {0x203B, 0x203B},
{ 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, {0x203E, 0x203E}, {0x2074, 0x2074}, {0x207F, 0x207F}, {0x2081, 0x2084}, {0x20AC, 0x20AC},
{ 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, {0x2103, 0x2103}, {0x2105, 0x2105}, {0x2109, 0x2109}, {0x2113, 0x2113}, {0x2116, 0x2116},
{ 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, {0x2121, 0x2122}, {0x2126, 0x2126}, {0x212B, 0x212B}, {0x2153, 0x2154}, {0x215B, 0x215E},
{ 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 }, {0x2160, 0x216B}, {0x2170, 0x2179}, {0x2190, 0x2199}, {0x21B8, 0x21B9}, {0x21D2, 0x21D2},
{ 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, {0x21D4, 0x21D4}, {0x21E7, 0x21E7}, {0x2200, 0x2200}, {0x2202, 0x2203}, {0x2207, 0x2208},
{ 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, {0x220B, 0x220B}, {0x220F, 0x220F}, {0x2211, 0x2211}, {0x2215, 0x2215}, {0x221A, 0x221A},
{ 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, {0x221D, 0x2220}, {0x2223, 0x2223}, {0x2225, 0x2225}, {0x2227, 0x222C}, {0x222E, 0x222E},
{ 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, {0x2234, 0x2237}, {0x223C, 0x223D}, {0x2248, 0x2248}, {0x224C, 0x224C}, {0x2252, 0x2252},
{ 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, {0x2260, 0x2261}, {0x2264, 0x2267}, {0x226A, 0x226B}, {0x226E, 0x226F}, {0x2282, 0x2283},
{ 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 }, {0x2286, 0x2287}, {0x2295, 0x2295}, {0x2299, 0x2299}, {0x22A5, 0x22A5}, {0x22BF, 0x22BF},
{ 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, {0x2312, 0x2312}, {0x2460, 0x24E9}, {0x24EB, 0x254B}, {0x2550, 0x2573}, {0x2580, 0x258F},
{ 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, {0x2592, 0x2595}, {0x25A0, 0x25A1}, {0x25A3, 0x25A9}, {0x25B2, 0x25B3}, {0x25B6, 0x25B7},
{ 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, {0x25BC, 0x25BD}, {0x25C0, 0x25C1}, {0x25C6, 0x25C8}, {0x25CB, 0x25CB}, {0x25CE, 0x25D1},
{ 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 }, {0x25E2, 0x25E5}, {0x25EF, 0x25EF}, {0x2605, 0x2606}, {0x2609, 0x2609}, {0x260E, 0x260F},
{ 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, {0x2614, 0x2615}, {0x261C, 0x261C}, {0x261E, 0x261E}, {0x2640, 0x2640}, {0x2642, 0x2642},
{ 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, {0x2660, 0x2661}, {0x2663, 0x2665}, {0x2667, 0x266A}, {0x266C, 0x266D}, {0x266F, 0x266F},
{ 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, {0x273D, 0x273D}, {0x2776, 0x277F}, {0xE000, 0xF8FF}, {0xFFFD, 0xFFFD}, {0xF0000, 0xFFFFD},
{ 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B }, {0x100000, 0x10FFFD}};
{ 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 },
{ 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 },
{ 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E },
{ 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 },
{ 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 },
{ 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F },
{ 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 },
{ 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF },
{ 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, { 0x24EB, 0x254B },
{ 0x2550, 0x2573 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 },
{ 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 },
{ 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 },
{ 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 },
{ 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 },
{ 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x2614, 0x2615 },
{ 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 },
{ 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 },
{ 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F },
{ 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0xE000, 0xF8FF },
{ 0xFFFD, 0xFFFD }, { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD }
};
/* binary search in table of non-spacing characters */ /* binary search in table of non-spacing characters */
if (bisearch(ucs, ambiguous, if (bisearch(ucs, ambiguous, sizeof(ambiguous) / sizeof(struct interval) - 1))
sizeof(ambiguous) / sizeof(struct interval) - 1))
return 2; return 2;
return mk_wcwidth(ucs); return mk_wcwidth(ucs);
} }
static inline int mk_wcswidth_cjk(const wchar_t* pwcs, size_t n) static inline int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n) {
{
int w, width = 0; int w, width = 0;
for (; *pwcs && n-- > 0; pwcs++) for (; *pwcs && n-- > 0; pwcs++)
@@ -317,26 +272,26 @@ static inline int mk_wcswidth_cjk(const wchar_t* pwcs, size_t n)
} }
// convert UTF-8 string to wstring // convert UTF-8 string to wstring
static inline std::wstring utf8_decode(const std::string& str) { static inline std::wstring utf8_decode(const std::string &str) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv; std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.from_bytes(str); return myconv.from_bytes(str);
} }
// convert wstring to UTF-8 string // convert wstring to UTF-8 string
static inline std::string utf8_encode(const std::wstring& str) { static inline std::string utf8_encode(const std::wstring &str) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv; std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str); return myconv.to_bytes(str);
} }
} } // namespace details
static inline int display_width(const std::string& input) { static inline int display_width(const std::string &input) {
using namespace unicode::details; using namespace unicode::details;
return mk_wcswidth(utf8_decode(input).c_str(), input.size()); return mk_wcswidth(utf8_decode(input).c_str(), input.size());
} }
static inline int display_width(const std::wstring& input) { static inline int display_width(const std::wstring &input) {
return details::mk_wcswidth(input.c_str(), input.size()); return details::mk_wcswidth(input.c_str(), input.size());
} }
} } // namespace unicode

View File

@@ -21,14 +21,10 @@ namespace indicators {
class IndeterminateProgressBar { class IndeterminateProgressBar {
using Settings = using Settings =
std::tuple<option::BarWidth, option::PrefixText, option::PostfixText, option::Start, std::tuple<option::BarWidth, option::PrefixText, option::PostfixText, option::Start,
option::End, option::Fill, option::Lead, option::End, option::Fill, option::Lead, option::MaxPostfixTextLen,
option::MaxPostfixTextLen, option::Completed, option::Completed, option::ForegroundColor, option::FontStyles, option::Stream>;
option::ForegroundColor, option::FontStyles, option::Stream>;
enum class Direction { enum class Direction { forward, backward };
forward,
backward
};
Direction direction_{Direction::forward}; Direction direction_{Direction::forward};
@@ -60,8 +56,8 @@ public:
option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...), option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::font_styles>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>( details::get<details::ProgressBarOption::stream>(option::Stream{std::cout},
option::Stream{std::cout}, std::forward<Args>(args)...)) { std::forward<Args>(args)...)) {
// starts with [<==>...........] // starts with [<==>...........]
// progress_ = 0 // progress_ = 0
@@ -70,10 +66,10 @@ public:
// ^^^^^^^^^^^^ (bar_width - len(lead)) // ^^^^^^^^^^^^ (bar_width - len(lead))
// progress_ = bar_width - len(lead) // progress_ = bar_width - len(lead)
progress_ = 0; progress_ = 0;
max_progress_ = get_value<details::ProgressBarOption::bar_width>() max_progress_ = get_value<details::ProgressBarOption::bar_width>() -
- get_value<details::ProgressBarOption::lead>().size() get_value<details::ProgressBarOption::lead>().size() +
+ get_value<details::ProgressBarOption::start>().size() get_value<details::ProgressBarOption::start>().size() +
+ get_value<details::ProgressBarOption::end>().size(); get_value<details::ProgressBarOption::end>().size();
} }
template <typename T, details::ProgressBarOption id> template <typename T, details::ProgressBarOption id>
@@ -130,9 +126,7 @@ public:
print_progress(); print_progress();
} }
bool is_completed() { bool is_completed() { return get_value<details::ProgressBarOption::completed>(); }
return get_value<details::ProgressBarOption::completed>();
}
void mark_as_completed() { void mark_as_completed() {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;
@@ -165,7 +159,7 @@ public:
void print_progress(bool from_multi_progress = false) { void print_progress(bool from_multi_progress = false) {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>(); auto &os = get_value<details::ProgressBarOption::stream>();
if (multi_progress_mode_ && !from_multi_progress) { if (multi_progress_mode_ && !from_multi_progress) {
return; return;
@@ -180,10 +174,10 @@ public:
os << get_value<details::ProgressBarOption::start>(); os << get_value<details::ProgressBarOption::start>();
details::IndeterminateProgressScaleWriter writer{os, details::IndeterminateProgressScaleWriter writer{
get_value<details::ProgressBarOption::bar_width>(), os, get_value<details::ProgressBarOption::bar_width>(),
get_value<details::ProgressBarOption::fill>(), get_value<details::ProgressBarOption::fill>(),
get_value<details::ProgressBarOption::lead>()}; get_value<details::ProgressBarOption::lead>()};
writer.write(progress_); writer.write(progress_);
os << get_value<details::ProgressBarOption::end>(); os << get_value<details::ProgressBarOption::end>();
@@ -191,8 +185,7 @@ public:
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
os << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << "\r";
<< "\r";
os.flush(); os.flush();
if (get_value<details::ProgressBarOption::completed>() && if (get_value<details::ProgressBarOption::completed>() &&
!from_multi_progress) // Don't std::endl if calling from MultiProgress !from_multi_progress) // Don't std::endl if calling from MultiProgress

View File

@@ -5,8 +5,8 @@
#include <mutex> #include <mutex>
#include <vector> #include <vector>
#include <indicators/cursor_movement.hpp>
#include <indicators/color.hpp> #include <indicators/color.hpp>
#include <indicators/cursor_movement.hpp>
namespace indicators { namespace indicators {

View File

@@ -24,10 +24,8 @@ class ProgressBar {
option::End, option::Fill, option::Lead, option::Remainder, option::End, option::Fill, option::Lead, option::Remainder,
option::MaxPostfixTextLen, option::Completed, option::ShowPercentage, option::MaxPostfixTextLen, option::Completed, option::ShowPercentage,
option::ShowElapsedTime, option::ShowRemainingTime, option::SavedStartTime, option::ShowElapsedTime, option::ShowRemainingTime, option::SavedStartTime,
option::ForegroundColor, option::FontStyles, option::ForegroundColor, option::FontStyles, option::MinProgress,
option::MinProgress, option::MaxProgress, option::MaxProgress, option::ProgressType, option::Stream>;
option::ProgressType,
option::Stream>;
public: public:
template <typename... Args, template <typename... Args,
@@ -35,53 +33,54 @@ public:
Settings, typename std::decay<Args>::type...>::value, Settings, typename std::decay<Args>::type...>::value,
void *>::type = nullptr> void *>::type = nullptr>
explicit ProgressBar(Args &&... args) explicit ProgressBar(Args &&... args)
: settings_(details::get<details::ProgressBarOption::bar_width>(option::BarWidth{100}, : settings_(
std::forward<Args>(args)...), details::get<details::ProgressBarOption::bar_width>(option::BarWidth{100},
details::get<details::ProgressBarOption::prefix_text>(
option::PrefixText{}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::postfix_text>(
option::PostfixText{}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::start>(option::Start{"["},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::end>(option::End{"]"},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::fill>(option::Fill{"="}, details::get<details::ProgressBarOption::prefix_text>(option::PrefixText{},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::lead>(option::Lead{">"}, details::get<details::ProgressBarOption::postfix_text>(option::PostfixText{},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::remainder>(option::Remainder{" "}, details::get<details::ProgressBarOption::start>(option::Start{"["},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::end>(option::End{"]"},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::fill>(option::Fill{"="},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::lead>(option::Lead{">"},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::remainder>(option::Remainder{" "},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_postfix_text_len>(
option::MaxPostfixTextLen{0}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::completed>(option::Completed{false},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::show_percentage>(option::ShowPercentage{false},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_postfix_text_len>( details::get<details::ProgressBarOption::show_elapsed_time>(
option::MaxPostfixTextLen{0}, std::forward<Args>(args)...), option::ShowElapsedTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::completed>(option::Completed{false}, details::get<details::ProgressBarOption::show_remaining_time>(
std::forward<Args>(args)...), option::ShowRemainingTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::show_percentage>( details::get<details::ProgressBarOption::saved_start_time>(
option::ShowPercentage{false}, std::forward<Args>(args)...), option::SavedStartTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::show_elapsed_time>( details::get<details::ProgressBarOption::foreground_color>(
option::ShowElapsedTime{false}, std::forward<Args>(args)...), option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::show_remaining_time>( details::get<details::ProgressBarOption::font_styles>(
option::ShowRemainingTime{false}, std::forward<Args>(args)...), option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::saved_start_time>( details::get<details::ProgressBarOption::min_progress>(option::MinProgress{0},
option::SavedStartTime{false}, std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::foreground_color>( details::get<details::ProgressBarOption::max_progress>(option::MaxProgress{100},
option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::progress_type>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::ProgressType{ProgressType::incremental}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::min_progress>( details::get<details::ProgressBarOption::stream>(option::Stream{std::cout},
option::MinProgress{0}, std::forward<Args>(args)...), std::forward<Args>(args)...)) {
details::get<details::ProgressBarOption::max_progress>(
option::MaxProgress{100}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::progress_type>(
option::ProgressType{ProgressType::incremental}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>(
option::Stream{std::cout}, std::forward<Args>(args)...)) {
// if progress is incremental, start from min_progress // if progress is incremental, start from min_progress
// else start from max_progress // else start from max_progress
const auto type = get_value<details::ProgressBarOption::progress_type>(); const auto type = get_value<details::ProgressBarOption::progress_type>();
if (type == ProgressType::incremental) if (type == ProgressType::incremental)
progress_ = get_value<details::ProgressBarOption::min_progress>(); progress_ = get_value<details::ProgressBarOption::min_progress>();
else else
progress_ = get_value<details::ProgressBarOption::max_progress>(); progress_ = get_value<details::ProgressBarOption::max_progress>();
} }
@@ -138,7 +137,7 @@ public:
const auto type = get_value<details::ProgressBarOption::progress_type>(); const auto type = get_value<details::ProgressBarOption::progress_type>();
if (type == ProgressType::incremental) if (type == ProgressType::incremental)
progress_ += 1; progress_ += 1;
else else
progress_ -= 1; progress_ -= 1;
} }
save_start_time(); save_start_time();
@@ -193,14 +192,14 @@ public:
void print_progress(bool from_multi_progress = false) { void print_progress(bool from_multi_progress = false) {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>(); auto &os = get_value<details::ProgressBarOption::stream>();
const auto type = get_value<details::ProgressBarOption::progress_type>(); const auto type = get_value<details::ProgressBarOption::progress_type>();
const auto min_progress = get_value<details::ProgressBarOption::min_progress>(); const auto min_progress = get_value<details::ProgressBarOption::min_progress>();
const auto max_progress = get_value<details::ProgressBarOption::max_progress>(); const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
if (multi_progress_mode_ && !from_multi_progress) { if (multi_progress_mode_ && !from_multi_progress) {
if ((type == ProgressType::incremental && progress_ >= max_progress) || if ((type == ProgressType::incremental && progress_ >= max_progress) ||
(type == ProgressType::decremental && progress_ <= min_progress)) { (type == ProgressType::decremental && progress_ <= min_progress)) {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;
} }
return; return;
@@ -219,8 +218,7 @@ public:
os << get_value<details::ProgressBarOption::start>(); os << get_value<details::ProgressBarOption::start>();
details::ProgressScaleWriter writer{os, details::ProgressScaleWriter writer{os, get_value<details::ProgressBarOption::bar_width>(),
get_value<details::ProgressBarOption::bar_width>(),
get_value<details::ProgressBarOption::fill>(), get_value<details::ProgressBarOption::fill>(),
get_value<details::ProgressBarOption::lead>(), get_value<details::ProgressBarOption::lead>(),
get_value<details::ProgressBarOption::remainder>()}; get_value<details::ProgressBarOption::remainder>()};
@@ -229,7 +227,10 @@ public:
os << get_value<details::ProgressBarOption::end>(); os << get_value<details::ProgressBarOption::end>();
if (get_value<details::ProgressBarOption::show_percentage>()) { if (get_value<details::ProgressBarOption::show_percentage>()) {
os << " " << std::min(static_cast<size_t>(static_cast<float>(progress_) / max_progress * 100), size_t(100)) << "%"; os << " "
<< std::min(static_cast<size_t>(static_cast<float>(progress_) / max_progress * 100),
size_t(100))
<< "%";
} }
auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>(); auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>();
@@ -250,7 +251,8 @@ public:
if (saved_start_time) { if (saved_start_time) {
auto eta = std::chrono::nanoseconds( auto eta = std::chrono::nanoseconds(
progress_ > 0 ? static_cast<long long>(elapsed_.count() * max_progress / progress_) : 0); progress_ > 0 ? static_cast<long long>(elapsed_.count() * max_progress / progress_)
: 0);
auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta); auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta);
details::write_duration(os, remaining); details::write_duration(os, remaining);
} else { } else {
@@ -266,13 +268,12 @@ public:
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
os << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << "\r";
<< "\r";
os.flush(); os.flush();
if ((type == ProgressType::incremental && progress_ >= max_progress) || if ((type == ProgressType::incremental && progress_ >= max_progress) ||
(type == ProgressType::decremental && progress_ <= min_progress)) { (type == ProgressType::decremental && progress_ <= min_progress)) {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;
} }
if (get_value<details::ProgressBarOption::completed>() && if (get_value<details::ProgressBarOption::completed>() &&
!from_multi_progress) // Don't std::endl if calling from MultiProgress !from_multi_progress) // Don't std::endl if calling from MultiProgress
os << termcolor::reset << std::endl; os << termcolor::reset << std::endl;

View File

@@ -32,36 +32,37 @@ public:
Settings, typename std::decay<Args>::type...>::value, Settings, typename std::decay<Args>::type...>::value,
void *>::type = nullptr> void *>::type = nullptr>
explicit ProgressSpinner(Args &&... args) explicit ProgressSpinner(Args &&... args)
: settings_(details::get<details::ProgressBarOption::foreground_color>( : settings_(
option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...), details::get<details::ProgressBarOption::foreground_color>(
details::get<details::ProgressBarOption::prefix_text>( option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...),
option::PrefixText{}, std::forward<Args>(args)...), details::get<details::ProgressBarOption::prefix_text>(option::PrefixText{},
details::get<details::ProgressBarOption::postfix_text>( std::forward<Args>(args)...),
option::PostfixText{}, std::forward<Args>(args)...), details::get<details::ProgressBarOption::postfix_text>(option::PostfixText{},
details::get<details::ProgressBarOption::show_percentage>( std::forward<Args>(args)...),
option::ShowPercentage{true}, std::forward<Args>(args)...), details::get<details::ProgressBarOption::show_percentage>(option::ShowPercentage{true},
details::get<details::ProgressBarOption::show_elapsed_time>(
option::ShowElapsedTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::show_remaining_time>(
option::ShowRemainingTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::spinner_show>(
option::ShowSpinner{true}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::saved_start_time>(
option::SavedStartTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::completed>(option::Completed{false},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_postfix_text_len>( details::get<details::ProgressBarOption::show_elapsed_time>(
option::MaxPostfixTextLen{0}, std::forward<Args>(args)...), option::ShowElapsedTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::spinner_states>( details::get<details::ProgressBarOption::show_remaining_time>(
option::SpinnerStates{std::vector<std::string>{"", "", "", "", "", "", option::ShowRemainingTime{false}, std::forward<Args>(args)...),
"", "", "", ""}}, details::get<details::ProgressBarOption::spinner_show>(option::ShowSpinner{true},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::saved_start_time>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::SavedStartTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_progress>( details::get<details::ProgressBarOption::completed>(option::Completed{false},
option::MaxProgress{100}, std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>( details::get<details::ProgressBarOption::max_postfix_text_len>(
option::Stream{std::cout}, std::forward<Args>(args)...)) {} option::MaxPostfixTextLen{0}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::spinner_states>(
option::SpinnerStates{
std::vector<std::string>{"", "", "", "", "", "", "", "", "", ""}},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_progress>(option::MaxProgress{100},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>(option::Stream{std::cout},
std::forward<Args>(args)...)) {}
template <typename T, details::ProgressBarOption id> template <typename T, details::ProgressBarOption id>
void set_option(details::Setting<T, id> &&setting) { void set_option(details::Setting<T, id> &&setting) {
@@ -162,7 +163,7 @@ public:
void print_progress() { void print_progress() {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>(); auto &os = get_value<details::ProgressBarOption::stream>();
const auto max_progress = get_value<details::ProgressBarOption::max_progress>(); const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
auto now = std::chrono::high_resolution_clock::now(); auto now = std::chrono::high_resolution_clock::now();
@@ -205,8 +206,7 @@ public:
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
os << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << "\r";
<< "\r";
os.flush(); os.flush();
index_ += 1; index_ += 1;
if (progress_ > max_progress) { if (progress_ > max_progress) {

View File

@@ -139,14 +139,14 @@ template <ProgressBarOption Id, typename Default> Default &&get_impl(Default &&d
} }
template <ProgressBarOption Id, typename Default, typename T, typename... Args> template <ProgressBarOption Id, typename Default, typename T, typename... Args>
auto get_impl(Default &&/*def*/, T &&first, Args &&... /*tail*/) -> auto get_impl(Default && /*def*/, T &&first, Args &&... /*tail*/) ->
typename std::enable_if<(std::decay<T>::type::id == Id), typename std::enable_if<(std::decay<T>::type::id == Id),
decltype(std::forward<T>(first))>::type { decltype(std::forward<T>(first))>::type {
return std::forward<T>(first); return std::forward<T>(first);
} }
template <ProgressBarOption Id, typename Default, typename T, typename... Args> template <ProgressBarOption Id, typename Default, typename T, typename... Args>
auto get_impl(Default &&def, T &&/*first*/, Args &&... tail) -> auto get_impl(Default &&def, T && /*first*/, Args &&... tail) ->
typename std::enable_if<(std::decay<T>::type::id != Id), typename std::enable_if<(std::decay<T>::type::id != Id),
decltype(get_impl<Id>(std::forward<Default>(def), decltype(get_impl<Id>(std::forward<Default>(def),
std::forward<Args>(tail)...))>::type { std::forward<Args>(tail)...))>::type {
@@ -210,9 +210,9 @@ using HideBarWhenComplete =
details::BooleanSetting<details::ProgressBarOption::hide_bar_when_complete>; details::BooleanSetting<details::ProgressBarOption::hide_bar_when_complete>;
using FontStyles = using FontStyles =
details::Setting<std::vector<FontStyle>, details::ProgressBarOption::font_styles>; details::Setting<std::vector<FontStyle>, details::ProgressBarOption::font_styles>;
using MinProgress = details::IntegerSetting<details::ProgressBarOption::min_progress>; using MinProgress = details::IntegerSetting<details::ProgressBarOption::min_progress>;
using MaxProgress = details::IntegerSetting<details::ProgressBarOption::max_progress>; using MaxProgress = details::IntegerSetting<details::ProgressBarOption::max_progress>;
using ProgressType = details::Setting<ProgressType, details::ProgressBarOption::progress_type>; using ProgressType = details::Setting<ProgressType, details::ProgressBarOption::progress_type>;
using Stream = details::Setting<std::ostream&, details::ProgressBarOption::stream>; using Stream = details::Setting<std::ostream &, details::ProgressBarOption::stream>;
} // namespace option } // namespace option
} // namespace indicators } // namespace indicators

View File

@@ -7,31 +7,27 @@ namespace indicators {
#include <windows.h> #include <windows.h>
std::pair<size_t, size_t> terminal_size() { std::pair<size_t, size_t> terminal_size() {
CONSOLE_SCREEN_BUFFER_INFO csbi; CONSOLE_SCREEN_BUFFER_INFO csbi;
int columns, rows; int columns, rows;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; columns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
return {static_cast<size_t>(rows), static_cast<size_t>(cols)}; return {static_cast<size_t>(rows), static_cast<size_t>(cols)};
} }
size_t terminal_width() { size_t terminal_width() { return terminal_size().second; }
return terminal_size().second;
}
#else #else
#include <sys/ioctl.h> //ioctl() and TIOCGWINSZ #include <sys/ioctl.h> //ioctl() and TIOCGWINSZ
#include <unistd.h> // for STDOUT_FILENO #include <unistd.h> // for STDOUT_FILENO
std::pair<size_t, size_t> terminal_size() { std::pair<size_t, size_t> terminal_size() {
struct winsize size; struct winsize size;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); ioctl(STDOUT_FILENO, TIOCGWINSZ, &size);
return {static_cast<size_t>(size.ws_row), static_cast<size_t>(size.ws_col)}; return {static_cast<size_t>(size.ws_row), static_cast<size_t>(size.ws_col)};
} }
size_t terminal_width() { size_t terminal_width() { return terminal_size().second; }
return terminal_size().second;
}
#endif #endif
} } // namespace indicators

View File

@@ -9,10 +9,9 @@ int main() {
indicators::show_console_cursor(false); indicators::show_console_cursor(false);
indicators::BlockProgressBar bar{ indicators::BlockProgressBar bar{
indicators::option::BarWidth{80}, indicators::option::BarWidth{80},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}} std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
};
// Update bar state // Update bar state
auto progress = 0.0f; auto progress = 0.0f;

View File

@@ -11,20 +11,15 @@ int main() {
// Random list of numbers // Random list of numbers
std::vector<size_t> numbers; std::vector<size_t> numbers;
for (size_t i = 0; i < 1259438; ++i) { for (size_t i = 0; i < 1259438; ++i) {
numbers.push_back(i); numbers.push_back(i);
} }
using namespace indicators; using namespace indicators;
BlockProgressBar bar{ BlockProgressBar bar{option::BarWidth{80}, option::ForegroundColor{Color::white},
option::BarWidth{80}, option::FontStyles{std::vector<FontStyle>{FontStyle::bold}},
option::ForegroundColor{Color::white}, option::MaxProgress{numbers.size()}};
option::FontStyles{
std::vector<FontStyle>{FontStyle::bold}},
option::MaxProgress{numbers.size()}
};
std::cout << "Iterating over a list of numbers (size = " std::cout << "Iterating over a list of numbers (size = " << numbers.size() << ")\n";
<< numbers.size() << ")\n";
std::vector<size_t> result; std::vector<size_t> result;
for (size_t i = 0; i < numbers.size(); ++i) { for (size_t i = 0; i < numbers.size(); ++i) {
@@ -33,9 +28,7 @@ int main() {
result.push_back(numbers[i] * numbers[i]); result.push_back(numbers[i] * numbers[i]);
// Show iteration as postfix text // Show iteration as postfix text
bar.set_option(option::PostfixText{ bar.set_option(option::PostfixText{std::to_string(i) + "/" + std::to_string(numbers.size())});
std::to_string(i) + "/" + std::to_string(numbers.size())
});
// update progress bar // update progress bar
bar.tick(); bar.tick();

View File

@@ -4,41 +4,53 @@ using namespace indicators;
int main() { int main() {
ProgressBar bar1{option::BarWidth{50}, option::ForegroundColor{Color::red}, ProgressBar bar1{option::BarWidth{50},
option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::ForegroundColor{Color::red},
option::ShowElapsedTime{true},
option::ShowRemainingTime{true},
option::PrefixText{"5c90d4a2d1a8: Downloading "}, option::PrefixText{"5c90d4a2d1a8: Downloading "},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
ProgressBar bar2{option::BarWidth{50}, option::ForegroundColor{Color::yellow}, ProgressBar bar2{option::BarWidth{50},
option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::ForegroundColor{Color::yellow},
option::ShowElapsedTime{true},
option::ShowRemainingTime{true},
option::PrefixText{"22337bfd13a9: Downloading "}, option::PrefixText{"22337bfd13a9: Downloading "},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
ProgressBar bar3{option::BarWidth{50}, option::ForegroundColor{Color::green}, ProgressBar bar3{option::BarWidth{50},
option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::ForegroundColor{Color::green},
option::ShowElapsedTime{true},
option::ShowRemainingTime{true},
option::PrefixText{"10f26c680a34: Downloading "}, option::PrefixText{"10f26c680a34: Downloading "},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
ProgressBar bar4{option::BarWidth{50}, option::ForegroundColor{Color::white}, ProgressBar bar4{option::BarWidth{50},
option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::ForegroundColor{Color::white},
option::ShowElapsedTime{true},
option::ShowRemainingTime{true},
option::PrefixText{"6364e0d7a283: Downloading "}, option::PrefixText{"6364e0d7a283: Downloading "},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
ProgressBar bar5{option::BarWidth{50}, option::ForegroundColor{Color::blue}, ProgressBar bar5{option::BarWidth{50},
option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::ForegroundColor{Color::blue},
option::ShowElapsedTime{true},
option::ShowRemainingTime{true},
option::PrefixText{"ff1356ba118b: Downloading "}, option::PrefixText{"ff1356ba118b: Downloading "},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
ProgressBar bar6{option::BarWidth{50}, option::ForegroundColor{Color::cyan}, ProgressBar bar6{option::BarWidth{50},
option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::ForegroundColor{Color::cyan},
option::ShowElapsedTime{true},
option::ShowRemainingTime{true},
option::PrefixText{"5a17453338b4: Downloading "}, option::PrefixText{"5a17453338b4: Downloading "},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
std::cout << termcolor::bold << termcolor::white << "Pulling image foo:bar/baz\n"; std::cout << termcolor::bold << termcolor::white << "Pulling image foo:bar/baz\n";

View File

@@ -1,6 +1,6 @@
#include <chrono> #include <chrono>
#include <indicators/indeterminate_progress_bar.hpp>
#include <indicators/cursor_control.hpp> #include <indicators/cursor_control.hpp>
#include <indicators/indeterminate_progress_bar.hpp>
#include <indicators/termcolor.hpp> #include <indicators/termcolor.hpp>
#include <thread> #include <thread>
@@ -14,16 +14,15 @@ int main() {
indicators::option::PostfixText{"Checking for Updates"}, indicators::option::PostfixText{"Checking for Updates"},
indicators::option::ForegroundColor{indicators::Color::yellow}, indicators::option::ForegroundColor{indicators::Color::yellow},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}} std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
};
indicators::show_console_cursor(false); indicators::show_console_cursor(false);
auto job = [&bar]() { auto job = [&bar]() {
std::this_thread::sleep_for(std::chrono::milliseconds(10000)); std::this_thread::sleep_for(std::chrono::milliseconds(10000));
bar.mark_as_completed(); bar.mark_as_completed();
std::cout << termcolor::bold << termcolor::green std::cout << termcolor::bold << termcolor::green << "System is up to date!\n"
<< "System is up to date!\n" << termcolor::reset; << termcolor::reset;
}; };
std::thread job_completion_thread(job); std::thread job_completion_thread(job);
@@ -34,7 +33,7 @@ int main() {
} }
job_completion_thread.join(); job_completion_thread.join();
indicators::show_console_cursor(true); indicators::show_console_cursor(true);
return 0; return 0;
} }

View File

@@ -9,11 +9,10 @@ int main() {
indicators::show_console_cursor(false); indicators::show_console_cursor(false);
indicators::BlockProgressBar bar{ indicators::BlockProgressBar bar{
indicators::option::BarWidth{80}, indicators::option::BarWidth{80},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}, std::vector<indicators::FontStyle>{indicators::FontStyle::bold}},
indicators::option::MaxProgress{400} indicators::option::MaxProgress{400}};
};
// Update bar state // Update bar state
while (true) { while (true) {

View File

@@ -3,23 +3,29 @@
int main() { int main() {
using namespace indicators; using namespace indicators;
BlockProgressBar bar1{option::BarWidth{50}, option::ForegroundColor{Color::yellow}, BlockProgressBar bar1{option::BarWidth{50},
option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::ForegroundColor{Color::yellow},
option::ShowElapsedTime{true},
option::ShowRemainingTime{true},
option::PrefixText{"Progress Bar #1 "}, option::PrefixText{"Progress Bar #1 "},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
BlockProgressBar bar2{option::BarWidth{50}, option::ForegroundColor{Color::cyan}, BlockProgressBar bar2{option::BarWidth{50},
option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::ForegroundColor{Color::cyan},
option::ShowElapsedTime{true},
option::ShowRemainingTime{true},
option::PrefixText{"Progress Bar #2 "}, option::PrefixText{"Progress Bar #2 "},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
BlockProgressBar bar3{option::BarWidth{50}, option::ForegroundColor{Color::red}, BlockProgressBar bar3{option::BarWidth{50},
option::ShowElapsedTime{true}, option::ShowRemainingTime{true}, option::ForegroundColor{Color::red},
option::ShowElapsedTime{true},
option::ShowRemainingTime{true},
option::PrefixText{"Progress Bar #3 "}, option::PrefixText{"Progress Bar #3 "},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
indicators::MultiProgress<indicators::BlockProgressBar, 3> bars(bar1, bar2, bar3); indicators::MultiProgress<indicators::BlockProgressBar, 3> bars(bar1, bar2, bar3);

View File

@@ -13,8 +13,8 @@ int main() {
indicators::option::ShowElapsedTime{true}, indicators::option::ShowElapsedTime{true},
indicators::option::ShowRemainingTime{true}, indicators::option::ShowRemainingTime{true},
indicators::option::PrefixText{"Progress Bar #1 "}, indicators::option::PrefixText{"Progress Bar #1 "},
indicators::option::FontStyles{ indicators::option::FontStyles{std::vector<indicators::FontStyle>{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; indicators::FontStyle::bold}}};
indicators::ProgressBar bar2{indicators::option::BarWidth{50}, indicators::ProgressBar bar2{indicators::option::BarWidth{50},
indicators::option::Start{"["}, indicators::option::Start{"["},
@@ -26,8 +26,8 @@ int main() {
indicators::option::ShowElapsedTime{true}, indicators::option::ShowElapsedTime{true},
indicators::option::ShowRemainingTime{true}, indicators::option::ShowRemainingTime{true},
indicators::option::PrefixText{"Progress Bar #2 "}, indicators::option::PrefixText{"Progress Bar #2 "},
indicators::option::FontStyles{ indicators::option::FontStyles{std::vector<indicators::FontStyle>{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; indicators::FontStyle::bold}}};
indicators::ProgressBar bar3{indicators::option::BarWidth{50}, indicators::ProgressBar bar3{indicators::option::BarWidth{50},
indicators::option::Start{"["}, indicators::option::Start{"["},
@@ -39,8 +39,8 @@ int main() {
indicators::option::ShowElapsedTime{true}, indicators::option::ShowElapsedTime{true},
indicators::option::ShowRemainingTime{true}, indicators::option::ShowRemainingTime{true},
indicators::option::PrefixText{"Progress Bar #3 "}, indicators::option::PrefixText{"Progress Bar #3 "},
indicators::option::FontStyles{ indicators::option::FontStyles{std::vector<indicators::FontStyle>{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}}; indicators::FontStyle::bold}}};
indicators::MultiProgress<indicators::ProgressBar, 3> bars(bar1, bar2, bar3); indicators::MultiProgress<indicators::ProgressBar, 3> bars(bar1, bar2, bar3);

View File

@@ -3,17 +3,15 @@
int main() { int main() {
indicators::ProgressBar bar{ indicators::ProgressBar bar{indicators::option::BarWidth{50},
indicators::option::BarWidth{50}, indicators::option::Start{"["},
indicators::option::Start{"["}, indicators::option::Fill{""},
indicators::option::Fill{""}, indicators::option::Lead{""},
indicators::option::Lead{""}, indicators::option::Remainder{"-"},
indicators::option::Remainder{"-"}, indicators::option::End{" ]"},
indicators::option::End{" ]"}, indicators::option::ForegroundColor{indicators::Color::yellow},
indicators::option::ForegroundColor{indicators::Color::yellow}, indicators::option::FontStyles{
indicators::option::FontStyles{ std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
// As configured, the bar will look like this: // As configured, the bar will look like this:
// //

View File

@@ -8,18 +8,16 @@ int main() {
// Hide cursor // Hide cursor
indicators::show_console_cursor(false); indicators::show_console_cursor(false);
indicators::ProgressBar bar{ indicators::ProgressBar bar{indicators::option::BarWidth{50},
indicators::option::BarWidth{50}, indicators::option::Start{"["},
indicators::option::Start{"["}, indicators::option::Fill{""},
indicators::option::Fill{""}, indicators::option::Lead{""},
indicators::option::Lead{""}, indicators::option::Remainder{"-"},
indicators::option::Remainder{"-"}, indicators::option::End{" ]"},
indicators::option::End{" ]"}, indicators::option::PostfixText{"Loading dependency 1/4"},
indicators::option::PostfixText{"Loading dependency 1/4"}, indicators::option::ForegroundColor{indicators::Color::cyan},
indicators::option::ForegroundColor{indicators::Color::cyan}, indicators::option::FontStyles{
indicators::option::FontStyles{ std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
// Update bar state // Update bar state
bar.set_progress(10); // 10% done bar.set_progress(10); // 10% done

View File

@@ -1,7 +1,7 @@
#include <chrono> #include <chrono>
#include <indicators/progress_bar.hpp> #include <indicators/progress_bar.hpp>
#include <thread>
#include <sstream> #include <sstream>
#include <thread>
int main() { int main() {
using namespace indicators; using namespace indicators;
@@ -17,10 +17,8 @@ int main() {
option::End{"]"}, option::End{"]"},
option::PostfixText{"Getting started"}, option::PostfixText{"Getting started"},
option::ForegroundColor{indicators::Color::green}, option::ForegroundColor{indicators::Color::green},
option::FontStyles{ option::FontStyles{std::vector<indicators::FontStyle>{indicators::FontStyle::bold}},
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}, option::Stream{os}};
option::Stream{os}
};
// Update bar state // Update bar state
while (true) { while (true) {

View File

@@ -3,18 +3,16 @@
#include <thread> #include <thread>
int main() { int main() {
indicators::ProgressBar bar{ indicators::ProgressBar bar{indicators::option::BarWidth{50},
indicators::option::BarWidth{50}, indicators::option::Start{"["},
indicators::option::Start{"["}, indicators::option::Fill{"="},
indicators::option::Fill{"="}, indicators::option::Lead{">"},
indicators::option::Lead{">"}, indicators::option::Remainder{" "},
indicators::option::Remainder{" "}, indicators::option::End{" ]"},
indicators::option::End{" ]"}, indicators::option::PostfixText{"Getting started"},
indicators::option::PostfixText{"Getting started"}, indicators::option::ForegroundColor{indicators::Color::green},
indicators::option::ForegroundColor{indicators::Color::green}, indicators::option::FontStyles{
indicators::option::FontStyles{ std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
// Update bar state // Update bar state
while (true) { while (true) {

View File

@@ -1,186 +1,173 @@
#include <chrono> #include <chrono>
#include <indicators/progress_bar.hpp>
#include <indicators/indeterminate_progress_bar.hpp>
#include <indicators/cursor_control.hpp> #include <indicators/cursor_control.hpp>
#include <indicators/indeterminate_progress_bar.hpp>
#include <indicators/progress_bar.hpp>
#include <thread> #include <thread>
int main() { int main() {
indicators::show_console_cursor(false); indicators::show_console_cursor(false);
std::this_thread::sleep_for(std::chrono::milliseconds(2000)); std::this_thread::sleep_for(std::chrono::milliseconds(2000));
{ {
// Plain old ASCII // Plain old ASCII
indicators::ProgressBar bar{ indicators::ProgressBar bar{indicators::option::BarWidth{50},
indicators::option::BarWidth{50}, indicators::option::Start{"["},
indicators::option::Start{"["}, indicators::option::Fill{"="},
indicators::option::Fill{"="}, indicators::option::Lead{">"},
indicators::option::Lead{">"}, indicators::option::Remainder{" "},
indicators::option::Remainder{" "}, indicators::option::End{" ]"},
indicators::option::End{" ]"}, indicators::option::PostfixText{"Plain-old ASCII"},
indicators::option::PostfixText{"Plain-old ASCII"}, indicators::option::ForegroundColor{indicators::Color::green},
indicators::option::ForegroundColor{indicators::Color::green}, indicators::option::FontStyles{std::vector<indicators::FontStyle>{
indicators::option::FontStyles{ indicators::FontStyle::bold}}};
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
// Update bar state // Update bar state
while (true) { while (true) {
bar.tick(); bar.tick();
if (bar.is_completed()) if (bar.is_completed())
break; break;
std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::this_thread::sleep_for(std::chrono::milliseconds(10));
} }
}
{
// Unicode
indicators::ProgressBar bar{indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{"驚くばかり"},
indicators::option::Lead{">"},
indicators::option::Remainder{" "},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Japanese"},
indicators::option::ForegroundColor{indicators::Color::yellow},
indicators::option::FontStyles{std::vector<indicators::FontStyle>{
indicators::FontStyle::bold}}};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
{
// Russian
indicators::ProgressBar bar{indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{"Потрясающие"},
indicators::option::Remainder{" "},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Russian"},
indicators::option::ForegroundColor{indicators::Color::red},
indicators::option::FontStyles{std::vector<indicators::FontStyle>{
indicators::FontStyle::bold}}};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
{
// Greek
indicators::ProgressBar bar{indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{"Φοβερός"},
indicators::option::Remainder{" "},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Greek"},
indicators::option::ForegroundColor{indicators::Color::cyan},
indicators::option::FontStyles{std::vector<indicators::FontStyle>{
indicators::FontStyle::bold}}};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
{
// Chinese
indicators::ProgressBar bar{indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{"太棒了"},
indicators::option::Remainder{" "},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Chinese"},
indicators::option::ForegroundColor{indicators::Color::green},
indicators::option::FontStyles{std::vector<indicators::FontStyle>{
indicators::FontStyle::bold}}};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
{
// Emojis
indicators::ProgressBar bar{indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{"🔥"},
indicators::option::Lead{"🔥"},
indicators::option::Remainder{" "},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Emojis"},
indicators::option::ForegroundColor{indicators::Color::white},
indicators::option::FontStyles{std::vector<indicators::FontStyle>{
indicators::FontStyle::bold}}};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
{
// Indeterminate progress bar
indicators::IndeterminateProgressBar bar{
indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{""},
indicators::option::Lead{"載入中"},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Loading Progress Bar"},
indicators::option::ForegroundColor{indicators::Color::yellow},
indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
auto job = [&bar]() {
std::this_thread::sleep_for(std::chrono::milliseconds(10000));
bar.mark_as_completed();
};
std::thread job_completion_thread(job);
// Update bar state
while (!bar.is_completed()) {
bar.tick();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
} }
{ job_completion_thread.join();
// Unicode }
indicators::ProgressBar bar{
indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{"驚くばかり"},
indicators::option::Lead{">"},
indicators::option::Remainder{" "},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Japanese"},
indicators::option::ForegroundColor{indicators::Color::yellow},
indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
// Update bar state indicators::show_console_cursor(true);
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
{
// Russian
indicators::ProgressBar bar{
indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{"Потрясающие"},
indicators::option::Remainder{" "},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Russian"},
indicators::option::ForegroundColor{indicators::Color::red},
indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
{
// Greek
indicators::ProgressBar bar{
indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{"Φοβερός"},
indicators::option::Remainder{" "},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Greek"},
indicators::option::ForegroundColor{indicators::Color::cyan},
indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
{
// Chinese
indicators::ProgressBar bar{
indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{"太棒了"},
indicators::option::Remainder{" "},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Chinese"},
indicators::option::ForegroundColor{indicators::Color::green},
indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
{
// Emojis
indicators::ProgressBar bar{
indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{"🔥"},
indicators::option::Lead{"🔥"},
indicators::option::Remainder{" "},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Emojis"},
indicators::option::ForegroundColor{indicators::Color::white},
indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
{
// Indeterminate progress bar
indicators::IndeterminateProgressBar bar{
indicators::option::BarWidth{50},
indicators::option::Start{"["},
indicators::option::Fill{""},
indicators::option::Lead{"載入中"},
indicators::option::End{" ]"},
indicators::option::PostfixText{"Loading Progress Bar"},
indicators::option::ForegroundColor{indicators::Color::yellow},
indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
auto job = [&bar]() {
std::this_thread::sleep_for(std::chrono::milliseconds(10000));
bar.mark_as_completed();
};
std::thread job_completion_thread(job);
// Update bar state
while (!bar.is_completed()) {
bar.tick();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
job_completion_thread.join();
}
indicators::show_console_cursor(true);
return 0; return 0;
} }

View File

@@ -12,8 +12,7 @@ int main() {
indicators::option::SpinnerStates{ indicators::option::SpinnerStates{
std::vector<std::string>{"", "", "", "", "", "", "", ""}}, std::vector<std::string>{"", "", "", "", "", "", "", ""}},
indicators::option::FontStyles{ indicators::option::FontStyles{
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}} std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
};
// Update spinner state // Update spinner state
auto job = [&spinner]() { auto job = [&spinner]() {

View File

@@ -7,20 +7,18 @@ int main() {
// Hide cursor // Hide cursor
indicators::show_console_cursor(false); indicators::show_console_cursor(false);
indicators::ProgressBar bar{ indicators::ProgressBar bar{indicators::option::BarWidth{50},
indicators::option::BarWidth{50}, indicators::option::Start{" ["},
indicators::option::Start{" ["}, indicators::option::Fill{""},
indicators::option::Fill{""}, indicators::option::Lead{""},
indicators::option::Lead{""}, indicators::option::Remainder{"-"},
indicators::option::Remainder{"-"}, indicators::option::End{"]"},
indicators::option::End{"]"}, indicators::option::PrefixText{"Training Gaze Network 👀"},
indicators::option::PrefixText{"Training Gaze Network 👀"}, indicators::option::ForegroundColor{indicators::Color::yellow},
indicators::option::ForegroundColor{indicators::Color::yellow}, indicators::option::ShowElapsedTime{true},
indicators::option::ShowElapsedTime{true}, indicators::option::ShowRemainingTime{true},
indicators::option::ShowRemainingTime{true}, indicators::option::FontStyles{
indicators::option::FontStyles{ std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}};
std::vector<indicators::FontStyle>{indicators::FontStyle::bold}}
};
// Update bar state // Update bar state
while (true) { while (true) {

View File

@@ -450,7 +450,6 @@ inline void win_change_attributes(std::ostream &stream, int foreground, int back
#endif // TERMCOLOR_HPP_ #endif // TERMCOLOR_HPP_
namespace indicators { namespace indicators {
enum class Color { grey, red, green, yellow, blue, magenta, cyan, white, unspecified }; enum class Color { grey, red, green, yellow, blue, magenta, cyan, white, unspecified };
} }
@@ -925,59 +924,30 @@ namespace indicators {
#include <windows.h> #include <windows.h>
std::pair<size_t, size_t> terminal_size() { std::pair<size_t, size_t> terminal_size() {
CONSOLE_SCREEN_BUFFER_INFO csbi; CONSOLE_SCREEN_BUFFER_INFO csbi;
int columns, rows; int columns, rows;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; columns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
return {static_cast<size_t>(rows), static_cast<size_t>(cols)}; return {static_cast<size_t>(rows), static_cast<size_t>(cols)};
} }
size_t terminal_width() { size_t terminal_width() { return terminal_size().second; }
return terminal_size().second;
}
#else #else
#include <sys/ioctl.h> //ioctl() and TIOCGWINSZ #include <sys/ioctl.h> //ioctl() and TIOCGWINSZ
#include <unistd.h> // for STDOUT_FILENO #include <unistd.h> // for STDOUT_FILENO
std::pair<size_t, size_t> terminal_size() { std::pair<size_t, size_t> terminal_size() {
struct winsize size; struct winsize size;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &size); ioctl(STDOUT_FILENO, TIOCGWINSZ, &size);
return {static_cast<size_t>(size.ws_row), static_cast<size_t>(size.ws_col)}; return {static_cast<size_t>(size.ws_row), static_cast<size_t>(size.ws_col)};
} }
size_t terminal_width() { size_t terminal_width() { return terminal_size().second; }
return terminal_size().second;
}
#endif #endif
}/* } // namespace indicators
Activity Indicators for Modern C++
https://github.com/p-ranav/indicators
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
SPDX-License-Identifier: MIT
Copyright (c) 2019 Dawid Pilarski <dawid.pilarski@panicsoftware.com>.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#pragma once #pragma once
#include <cstddef> #include <cstddef>
@@ -1093,14 +1063,14 @@ template <ProgressBarOption Id, typename Default> Default &&get_impl(Default &&d
} }
template <ProgressBarOption Id, typename Default, typename T, typename... Args> template <ProgressBarOption Id, typename Default, typename T, typename... Args>
auto get_impl(Default &&/*def*/, T &&first, Args &&... /*tail*/) -> auto get_impl(Default && /*def*/, T &&first, Args &&... /*tail*/) ->
typename std::enable_if<(std::decay<T>::type::id == Id), typename std::enable_if<(std::decay<T>::type::id == Id),
decltype(std::forward<T>(first))>::type { decltype(std::forward<T>(first))>::type {
return std::forward<T>(first); return std::forward<T>(first);
} }
template <ProgressBarOption Id, typename Default, typename T, typename... Args> template <ProgressBarOption Id, typename Default, typename T, typename... Args>
auto get_impl(Default &&def, T &&/*first*/, Args &&... tail) -> auto get_impl(Default &&def, T && /*first*/, Args &&... tail) ->
typename std::enable_if<(std::decay<T>::type::id != Id), typename std::enable_if<(std::decay<T>::type::id != Id),
decltype(get_impl<Id>(std::forward<Default>(def), decltype(get_impl<Id>(std::forward<Default>(def),
std::forward<Args>(tail)...))>::type { std::forward<Args>(tail)...))>::type {
@@ -1164,10 +1134,10 @@ using HideBarWhenComplete =
details::BooleanSetting<details::ProgressBarOption::hide_bar_when_complete>; details::BooleanSetting<details::ProgressBarOption::hide_bar_when_complete>;
using FontStyles = using FontStyles =
details::Setting<std::vector<FontStyle>, details::ProgressBarOption::font_styles>; details::Setting<std::vector<FontStyle>, details::ProgressBarOption::font_styles>;
using MinProgress = details::IntegerSetting<details::ProgressBarOption::min_progress>; using MinProgress = details::IntegerSetting<details::ProgressBarOption::min_progress>;
using MaxProgress = details::IntegerSetting<details::ProgressBarOption::max_progress>; using MaxProgress = details::IntegerSetting<details::ProgressBarOption::max_progress>;
using ProgressType = details::Setting<ProgressType, details::ProgressBarOption::progress_type>; using ProgressType = details::Setting<ProgressType, details::ProgressBarOption::progress_type>;
using Stream = details::Setting<std::ostream&, details::ProgressBarOption::stream>; using Stream = details::Setting<std::ostream &, details::ProgressBarOption::stream>;
} // namespace option } // namespace option
} // namespace indicators } // namespace indicators
#pragma once #pragma once
@@ -1204,7 +1174,7 @@ static inline void show_console_cursor(bool const show) {
#endif #endif
} // namespace indicators#pragma once } // namespace indicators
#if defined(_MSC_VER) #if defined(_MSC_VER)
#if !defined(NOMINMAX) #if !defined(NOMINMAX)
@@ -1249,17 +1219,17 @@ static inline void move_left(int cols) { std::cout << "\033[" << cols << "D"; }
#endif #endif
} // namespace indicators#pragma once } // namespace indicators
// #include <indicators/setting.hpp> // #include <indicators/setting.hpp>
// #include <indicators/termcolor.hpp> // #include <indicators/termcolor.hpp>
// #include <indicators/display_width.hpp> // #include <indicators/display_width.hpp>
#include <wchar.h>
#include <string>
#include <clocale> #include <clocale>
#include <locale>
#include <cstdlib>
#include <codecvt> #include <codecvt>
#include <cstdlib>
#include <locale>
#include <string>
#include <wchar.h>
namespace unicode { namespace unicode {
@@ -1332,7 +1302,7 @@ struct interval {
}; };
/* auxiliary function for binary search in interval table */ /* auxiliary function for binary search in interval table */
static inline int bisearch(wchar_t ucs, const struct interval* table, int max) { static inline int bisearch(wchar_t ucs, const struct interval *table, int max) {
int min = 0; int min = 0;
int mid; int mid;
@@ -1351,7 +1321,6 @@ static inline int bisearch(wchar_t ucs, const struct interval* table, int max) {
return 0; return 0;
} }
/* The following two functions define the column width of an ISO 10646 /* The following two functions define the column width of an ISO 10646
* character as follows: * character as follows:
* *
@@ -1384,60 +1353,46 @@ static inline int bisearch(wchar_t ucs, const struct interval* table, int max) {
* in ISO 10646. * in ISO 10646.
*/ */
static inline int mk_wcwidth(wchar_t ucs) static inline int mk_wcwidth(wchar_t ucs) {
{
/* sorted list of non-overlapping intervals of non-spacing characters */ /* sorted list of non-overlapping intervals of non-spacing characters */
/* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */
static const struct interval combining[] = { static const struct interval combining[] = {
{ 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, {0x0300, 0x036F}, {0x0483, 0x0486}, {0x0488, 0x0489}, {0x0591, 0x05BD},
{ 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, {0x05BF, 0x05BF}, {0x05C1, 0x05C2}, {0x05C4, 0x05C5}, {0x05C7, 0x05C7},
{ 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 }, {0x0600, 0x0603}, {0x0610, 0x0615}, {0x064B, 0x065E}, {0x0670, 0x0670},
{ 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 }, {0x06D6, 0x06E4}, {0x06E7, 0x06E8}, {0x06EA, 0x06ED}, {0x070F, 0x070F},
{ 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, {0x0711, 0x0711}, {0x0730, 0x074A}, {0x07A6, 0x07B0}, {0x07EB, 0x07F3},
{ 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, {0x0901, 0x0902}, {0x093C, 0x093C}, {0x0941, 0x0948}, {0x094D, 0x094D},
{ 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 }, {0x0951, 0x0954}, {0x0962, 0x0963}, {0x0981, 0x0981}, {0x09BC, 0x09BC},
{ 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, {0x09C1, 0x09C4}, {0x09CD, 0x09CD}, {0x09E2, 0x09E3}, {0x0A01, 0x0A02},
{ 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, {0x0A3C, 0x0A3C}, {0x0A41, 0x0A42}, {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D},
{ 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, {0x0A70, 0x0A71}, {0x0A81, 0x0A82}, {0x0ABC, 0x0ABC}, {0x0AC1, 0x0AC5},
{ 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, {0x0AC7, 0x0AC8}, {0x0ACD, 0x0ACD}, {0x0AE2, 0x0AE3}, {0x0B01, 0x0B01},
{ 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, {0x0B3C, 0x0B3C}, {0x0B3F, 0x0B3F}, {0x0B41, 0x0B43}, {0x0B4D, 0x0B4D},
{ 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, {0x0B56, 0x0B56}, {0x0B82, 0x0B82}, {0x0BC0, 0x0BC0}, {0x0BCD, 0x0BCD},
{ 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, {0x0C3E, 0x0C40}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, {0x0C55, 0x0C56},
{ 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, {0x0CBC, 0x0CBC}, {0x0CBF, 0x0CBF}, {0x0CC6, 0x0CC6}, {0x0CCC, 0x0CCD},
{ 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, {0x0CE2, 0x0CE3}, {0x0D41, 0x0D43}, {0x0D4D, 0x0D4D}, {0x0DCA, 0x0DCA},
{ 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, {0x0DD2, 0x0DD4}, {0x0DD6, 0x0DD6}, {0x0E31, 0x0E31}, {0x0E34, 0x0E3A},
{ 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, {0x0E47, 0x0E4E}, {0x0EB1, 0x0EB1}, {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC},
{ 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, {0x0EC8, 0x0ECD}, {0x0F18, 0x0F19}, {0x0F35, 0x0F35}, {0x0F37, 0x0F37},
{ 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, {0x0F39, 0x0F39}, {0x0F71, 0x0F7E}, {0x0F80, 0x0F84}, {0x0F86, 0x0F87},
{ 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, {0x0F90, 0x0F97}, {0x0F99, 0x0FBC}, {0x0FC6, 0x0FC6}, {0x102D, 0x1030},
{ 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, {0x1032, 0x1032}, {0x1036, 0x1037}, {0x1039, 0x1039}, {0x1058, 0x1059},
{ 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, {0x1160, 0x11FF}, {0x135F, 0x135F}, {0x1712, 0x1714}, {0x1732, 0x1734},
{ 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, {0x1752, 0x1753}, {0x1772, 0x1773}, {0x17B4, 0x17B5}, {0x17B7, 0x17BD},
{ 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, {0x17C6, 0x17C6}, {0x17C9, 0x17D3}, {0x17DD, 0x17DD}, {0x180B, 0x180D},
{ 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, {0x18A9, 0x18A9}, {0x1920, 0x1922}, {0x1927, 0x1928}, {0x1932, 0x1932},
{ 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, {0x1939, 0x193B}, {0x1A17, 0x1A18}, {0x1B00, 0x1B03}, {0x1B34, 0x1B34},
{ 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, {0x1B36, 0x1B3A}, {0x1B3C, 0x1B3C}, {0x1B42, 0x1B42}, {0x1B6B, 0x1B73},
{ 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, {0x1DC0, 0x1DCA}, {0x1DFE, 0x1DFF}, {0x200B, 0x200F}, {0x202A, 0x202E},
{ 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F }, {0x2060, 0x2063}, {0x206A, 0x206F}, {0x20D0, 0x20EF}, {0x302A, 0x302F},
{ 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, {0x3099, 0x309A}, {0xA806, 0xA806}, {0xA80B, 0xA80B}, {0xA825, 0xA826},
{ 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, {0xFB1E, 0xFB1E}, {0xFE00, 0xFE0F}, {0xFE20, 0xFE23}, {0xFEFF, 0xFEFF},
{ 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, {0xFFF9, 0xFFFB}, {0x10A01, 0x10A03}, {0x10A05, 0x10A06}, {0x10A0C, 0x10A0F},
{ 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, {0x10A38, 0x10A3A}, {0x10A3F, 0x10A3F}, {0x1D167, 0x1D169}, {0x1D173, 0x1D182},
{ 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, {0x1D185, 0x1D18B}, {0x1D1AA, 0x1D1AD}, {0x1D242, 0x1D244}, {0xE0001, 0xE0001},
{ 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, {0xE0020, 0xE007F}, {0xE0100, 0xE01EF}};
{ 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 },
{ 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF },
{ 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 },
{ 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F },
{ 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B },
{ 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F },
{ 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB },
{ 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F },
{ 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 },
{ 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD },
{ 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F },
{ 0xE0100, 0xE01EF }
};
/* test for 8-bit control characters */ /* test for 8-bit control characters */
if (ucs == 0) if (ucs == 0)
@@ -1446,30 +1401,25 @@ static inline int mk_wcwidth(wchar_t ucs)
return -1; return -1;
/* binary search in table of non-spacing characters */ /* binary search in table of non-spacing characters */
if (bisearch(ucs, combining, if (bisearch(ucs, combining, sizeof(combining) / sizeof(struct interval) - 1))
sizeof(combining) / sizeof(struct interval) - 1))
return 0; return 0;
/* if we arrive here, ucs is not a combining or C0/C1 control character */ /* if we arrive here, ucs is not a combining or C0/C1 control character */
return 1 + return 1 + (ucs >= 0x1100 &&
(ucs >= 0x1100 && (ucs <= 0x115f || /* Hangul Jamo init. consonants */
(ucs <= 0x115f || /* Hangul Jamo init. consonants */ ucs == 0x2329 || ucs == 0x232a ||
ucs == 0x2329 || ucs == 0x232a || (ucs >= 0x2e80 && ucs <= 0xa4cf && ucs != 0x303f) || /* CJK ... Yi */
(ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */
ucs != 0x303f) || /* CJK ... Yi */ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */
(ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */
(ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */
(ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */ (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */
(ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ (ucs >= 0xffe0 && ucs <= 0xffe6) || (ucs >= 0x20000 && ucs <= 0x2fffd) ||
(ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */ (ucs >= 0x30000 && ucs <= 0x3fffd)));
(ucs >= 0xffe0 && ucs <= 0xffe6) ||
(ucs >= 0x20000 && ucs <= 0x2fffd) ||
(ucs >= 0x30000 && ucs <= 0x3fffd)));
} }
static inline int mk_wcswidth(const wchar_t* pwcs, size_t n) static inline int mk_wcswidth(const wchar_t *pwcs, size_t n) {
{
int w, width = 0; int w, width = 0;
for (; *pwcs && n-- > 0; pwcs++) for (; *pwcs && n-- > 0; pwcs++)
@@ -1481,7 +1431,6 @@ static inline int mk_wcswidth(const wchar_t* pwcs, size_t n)
return width; return width;
} }
/* /*
* The following functions are the same as mk_wcwidth() and * The following functions are the same as mk_wcwidth() and
* mk_wcswidth(), except that spacing characters in the East Asian * mk_wcswidth(), except that spacing characters in the East Asian
@@ -1491,75 +1440,51 @@ static inline int mk_wcswidth(const wchar_t* pwcs, size_t n)
* the traditional terminal character-width behaviour. It is not * the traditional terminal character-width behaviour. It is not
* otherwise recommended for general use. * otherwise recommended for general use.
*/ */
static inline int mk_wcwidth_cjk(wchar_t ucs) static inline int mk_wcwidth_cjk(wchar_t ucs) {
{
/* sorted list of non-overlapping intervals of East Asian Ambiguous /* sorted list of non-overlapping intervals of East Asian Ambiguous
* characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */ * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */
static const struct interval ambiguous[] = { static const struct interval ambiguous[] = {
{ 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8}, {0x00AA, 0x00AA}, {0x00AE, 0x00AE},
{ 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 }, {0x00B0, 0x00B4}, {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6}, {0x00D0, 0x00D0},
{ 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, {0x00D7, 0x00D8}, {0x00DE, 0x00E1}, {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED},
{ 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA}, {0x00FC, 0x00FC}, {0x00FE, 0x00FE},
{ 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, {0x0101, 0x0101}, {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B}, {0x0126, 0x0127},
{ 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, {0x012B, 0x012B}, {0x0131, 0x0133}, {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144},
{ 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, {0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153}, {0x0166, 0x0167}, {0x016B, 0x016B},
{ 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, {0x01CE, 0x01CE}, {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4}, {0x01D6, 0x01D6},
{ 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, {0x01D8, 0x01D8}, {0x01DA, 0x01DA}, {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261},
{ 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB}, {0x02CD, 0x02CD}, {0x02D0, 0x02D0},
{ 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, {0x02D8, 0x02DB}, {0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0391, 0x03A1}, {0x03A3, 0x03A9},
{ 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, {0x03B1, 0x03C1}, {0x03C3, 0x03C9}, {0x0401, 0x0401}, {0x0410, 0x044F}, {0x0451, 0x0451},
{ 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, {0x2010, 0x2010}, {0x2013, 0x2016}, {0x2018, 0x2019}, {0x201C, 0x201D}, {0x2020, 0x2022},
{ 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, {0x2024, 0x2027}, {0x2030, 0x2030}, {0x2032, 0x2033}, {0x2035, 0x2035}, {0x203B, 0x203B},
{ 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, {0x203E, 0x203E}, {0x2074, 0x2074}, {0x207F, 0x207F}, {0x2081, 0x2084}, {0x20AC, 0x20AC},
{ 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, {0x2103, 0x2103}, {0x2105, 0x2105}, {0x2109, 0x2109}, {0x2113, 0x2113}, {0x2116, 0x2116},
{ 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, {0x2121, 0x2122}, {0x2126, 0x2126}, {0x212B, 0x212B}, {0x2153, 0x2154}, {0x215B, 0x215E},
{ 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 }, {0x2160, 0x216B}, {0x2170, 0x2179}, {0x2190, 0x2199}, {0x21B8, 0x21B9}, {0x21D2, 0x21D2},
{ 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, {0x21D4, 0x21D4}, {0x21E7, 0x21E7}, {0x2200, 0x2200}, {0x2202, 0x2203}, {0x2207, 0x2208},
{ 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, {0x220B, 0x220B}, {0x220F, 0x220F}, {0x2211, 0x2211}, {0x2215, 0x2215}, {0x221A, 0x221A},
{ 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, {0x221D, 0x2220}, {0x2223, 0x2223}, {0x2225, 0x2225}, {0x2227, 0x222C}, {0x222E, 0x222E},
{ 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, {0x2234, 0x2237}, {0x223C, 0x223D}, {0x2248, 0x2248}, {0x224C, 0x224C}, {0x2252, 0x2252},
{ 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, {0x2260, 0x2261}, {0x2264, 0x2267}, {0x226A, 0x226B}, {0x226E, 0x226F}, {0x2282, 0x2283},
{ 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 }, {0x2286, 0x2287}, {0x2295, 0x2295}, {0x2299, 0x2299}, {0x22A5, 0x22A5}, {0x22BF, 0x22BF},
{ 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, {0x2312, 0x2312}, {0x2460, 0x24E9}, {0x24EB, 0x254B}, {0x2550, 0x2573}, {0x2580, 0x258F},
{ 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, {0x2592, 0x2595}, {0x25A0, 0x25A1}, {0x25A3, 0x25A9}, {0x25B2, 0x25B3}, {0x25B6, 0x25B7},
{ 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, {0x25BC, 0x25BD}, {0x25C0, 0x25C1}, {0x25C6, 0x25C8}, {0x25CB, 0x25CB}, {0x25CE, 0x25D1},
{ 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 }, {0x25E2, 0x25E5}, {0x25EF, 0x25EF}, {0x2605, 0x2606}, {0x2609, 0x2609}, {0x260E, 0x260F},
{ 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, {0x2614, 0x2615}, {0x261C, 0x261C}, {0x261E, 0x261E}, {0x2640, 0x2640}, {0x2642, 0x2642},
{ 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, {0x2660, 0x2661}, {0x2663, 0x2665}, {0x2667, 0x266A}, {0x266C, 0x266D}, {0x266F, 0x266F},
{ 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, {0x273D, 0x273D}, {0x2776, 0x277F}, {0xE000, 0xF8FF}, {0xFFFD, 0xFFFD}, {0xF0000, 0xFFFFD},
{ 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B }, {0x100000, 0x10FFFD}};
{ 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 },
{ 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 },
{ 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E },
{ 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 },
{ 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 },
{ 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F },
{ 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 },
{ 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF },
{ 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, { 0x24EB, 0x254B },
{ 0x2550, 0x2573 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 },
{ 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 },
{ 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 },
{ 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 },
{ 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 },
{ 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x2614, 0x2615 },
{ 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 },
{ 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 },
{ 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F },
{ 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0xE000, 0xF8FF },
{ 0xFFFD, 0xFFFD }, { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD }
};
/* binary search in table of non-spacing characters */ /* binary search in table of non-spacing characters */
if (bisearch(ucs, ambiguous, if (bisearch(ucs, ambiguous, sizeof(ambiguous) / sizeof(struct interval) - 1))
sizeof(ambiguous) / sizeof(struct interval) - 1))
return 2; return 2;
return mk_wcwidth(ucs); return mk_wcwidth(ucs);
} }
static inline int mk_wcswidth_cjk(const wchar_t* pwcs, size_t n) static inline int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n) {
{
int w, width = 0; int w, width = 0;
for (; *pwcs && n-- > 0; pwcs++) for (; *pwcs && n-- > 0; pwcs++)
@@ -1572,30 +1497,29 @@ static inline int mk_wcswidth_cjk(const wchar_t* pwcs, size_t n)
} }
// convert UTF-8 string to wstring // convert UTF-8 string to wstring
static inline std::wstring utf8_decode(const std::string& str) { static inline std::wstring utf8_decode(const std::string &str) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv; std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.from_bytes(str); return myconv.from_bytes(str);
} }
// convert wstring to UTF-8 string // convert wstring to UTF-8 string
static inline std::string utf8_encode(const std::wstring& str) { static inline std::string utf8_encode(const std::wstring &str) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv; std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str); return myconv.to_bytes(str);
} }
} } // namespace details
static inline int display_width(const std::string& input) { static inline int display_width(const std::string &input) {
using namespace unicode::details; using namespace unicode::details;
return mk_wcswidth(utf8_decode(input).c_str(), input.size()); return mk_wcswidth(utf8_decode(input).c_str(), input.size());
} }
static inline int display_width(const std::wstring& input) { static inline int display_width(const std::wstring &input) {
return details::mk_wcswidth(input.c_str(), input.size()); return details::mk_wcswidth(input.c_str(), input.size());
} }
} } // namespace unicode
#include <algorithm> #include <algorithm>
#include <chrono> #include <chrono>
@@ -1771,7 +1695,7 @@ private:
class IndeterminateProgressScaleWriter { class IndeterminateProgressScaleWriter {
public: public:
IndeterminateProgressScaleWriter(std::ostream &os, size_t bar_width, const std::string &fill, IndeterminateProgressScaleWriter(std::ostream &os, size_t bar_width, const std::string &fill,
const std::string &lead) const std::string &lead)
: os(os), bar_width(bar_width), fill(fill), lead(lead) {} : os(os), bar_width(bar_width), fill(fill), lead(lead) {}
std::ostream &write(size_t progress) { std::ostream &write(size_t progress) {
@@ -1838,10 +1762,8 @@ class ProgressBar {
option::End, option::Fill, option::Lead, option::Remainder, option::End, option::Fill, option::Lead, option::Remainder,
option::MaxPostfixTextLen, option::Completed, option::ShowPercentage, option::MaxPostfixTextLen, option::Completed, option::ShowPercentage,
option::ShowElapsedTime, option::ShowRemainingTime, option::SavedStartTime, option::ShowElapsedTime, option::ShowRemainingTime, option::SavedStartTime,
option::ForegroundColor, option::FontStyles, option::ForegroundColor, option::FontStyles, option::MinProgress,
option::MinProgress, option::MaxProgress, option::MaxProgress, option::ProgressType, option::Stream>;
option::ProgressType,
option::Stream>;
public: public:
template <typename... Args, template <typename... Args,
@@ -1849,53 +1771,54 @@ public:
Settings, typename std::decay<Args>::type...>::value, Settings, typename std::decay<Args>::type...>::value,
void *>::type = nullptr> void *>::type = nullptr>
explicit ProgressBar(Args &&... args) explicit ProgressBar(Args &&... args)
: settings_(details::get<details::ProgressBarOption::bar_width>(option::BarWidth{100}, : settings_(
std::forward<Args>(args)...), details::get<details::ProgressBarOption::bar_width>(option::BarWidth{100},
details::get<details::ProgressBarOption::prefix_text>(
option::PrefixText{}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::postfix_text>(
option::PostfixText{}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::start>(option::Start{"["},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::end>(option::End{"]"},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::fill>(option::Fill{"="}, details::get<details::ProgressBarOption::prefix_text>(option::PrefixText{},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::lead>(option::Lead{">"}, details::get<details::ProgressBarOption::postfix_text>(option::PostfixText{},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::remainder>(option::Remainder{" "}, details::get<details::ProgressBarOption::start>(option::Start{"["},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::end>(option::End{"]"},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::fill>(option::Fill{"="},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::lead>(option::Lead{">"},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::remainder>(option::Remainder{" "},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_postfix_text_len>(
option::MaxPostfixTextLen{0}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::completed>(option::Completed{false},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::show_percentage>(option::ShowPercentage{false},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_postfix_text_len>( details::get<details::ProgressBarOption::show_elapsed_time>(
option::MaxPostfixTextLen{0}, std::forward<Args>(args)...), option::ShowElapsedTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::completed>(option::Completed{false}, details::get<details::ProgressBarOption::show_remaining_time>(
std::forward<Args>(args)...), option::ShowRemainingTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::show_percentage>( details::get<details::ProgressBarOption::saved_start_time>(
option::ShowPercentage{false}, std::forward<Args>(args)...), option::SavedStartTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::show_elapsed_time>( details::get<details::ProgressBarOption::foreground_color>(
option::ShowElapsedTime{false}, std::forward<Args>(args)...), option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::show_remaining_time>( details::get<details::ProgressBarOption::font_styles>(
option::ShowRemainingTime{false}, std::forward<Args>(args)...), option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::saved_start_time>( details::get<details::ProgressBarOption::min_progress>(option::MinProgress{0},
option::SavedStartTime{false}, std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::foreground_color>( details::get<details::ProgressBarOption::max_progress>(option::MaxProgress{100},
option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::progress_type>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::ProgressType{ProgressType::incremental}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::min_progress>( details::get<details::ProgressBarOption::stream>(option::Stream{std::cout},
option::MinProgress{0}, std::forward<Args>(args)...), std::forward<Args>(args)...)) {
details::get<details::ProgressBarOption::max_progress>(
option::MaxProgress{100}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::progress_type>(
option::ProgressType{ProgressType::incremental}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>(
option::Stream{std::cout}, std::forward<Args>(args)...)) {
// if progress is incremental, start from min_progress // if progress is incremental, start from min_progress
// else start from max_progress // else start from max_progress
const auto type = get_value<details::ProgressBarOption::progress_type>(); const auto type = get_value<details::ProgressBarOption::progress_type>();
if (type == ProgressType::incremental) if (type == ProgressType::incremental)
progress_ = get_value<details::ProgressBarOption::min_progress>(); progress_ = get_value<details::ProgressBarOption::min_progress>();
else else
progress_ = get_value<details::ProgressBarOption::max_progress>(); progress_ = get_value<details::ProgressBarOption::max_progress>();
} }
@@ -1952,7 +1875,7 @@ public:
const auto type = get_value<details::ProgressBarOption::progress_type>(); const auto type = get_value<details::ProgressBarOption::progress_type>();
if (type == ProgressType::incremental) if (type == ProgressType::incremental)
progress_ += 1; progress_ += 1;
else else
progress_ -= 1; progress_ -= 1;
} }
save_start_time(); save_start_time();
@@ -2007,14 +1930,14 @@ public:
void print_progress(bool from_multi_progress = false) { void print_progress(bool from_multi_progress = false) {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>(); auto &os = get_value<details::ProgressBarOption::stream>();
const auto type = get_value<details::ProgressBarOption::progress_type>(); const auto type = get_value<details::ProgressBarOption::progress_type>();
const auto min_progress = get_value<details::ProgressBarOption::min_progress>(); const auto min_progress = get_value<details::ProgressBarOption::min_progress>();
const auto max_progress = get_value<details::ProgressBarOption::max_progress>(); const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
if (multi_progress_mode_ && !from_multi_progress) { if (multi_progress_mode_ && !from_multi_progress) {
if ((type == ProgressType::incremental && progress_ >= max_progress) || if ((type == ProgressType::incremental && progress_ >= max_progress) ||
(type == ProgressType::decremental && progress_ <= min_progress)) { (type == ProgressType::decremental && progress_ <= min_progress)) {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;
} }
return; return;
@@ -2033,8 +1956,7 @@ public:
os << get_value<details::ProgressBarOption::start>(); os << get_value<details::ProgressBarOption::start>();
details::ProgressScaleWriter writer{os, details::ProgressScaleWriter writer{os, get_value<details::ProgressBarOption::bar_width>(),
get_value<details::ProgressBarOption::bar_width>(),
get_value<details::ProgressBarOption::fill>(), get_value<details::ProgressBarOption::fill>(),
get_value<details::ProgressBarOption::lead>(), get_value<details::ProgressBarOption::lead>(),
get_value<details::ProgressBarOption::remainder>()}; get_value<details::ProgressBarOption::remainder>()};
@@ -2043,7 +1965,10 @@ public:
os << get_value<details::ProgressBarOption::end>(); os << get_value<details::ProgressBarOption::end>();
if (get_value<details::ProgressBarOption::show_percentage>()) { if (get_value<details::ProgressBarOption::show_percentage>()) {
os << " " << std::min(static_cast<size_t>(static_cast<float>(progress_) / max_progress * 100), size_t(100)) << "%"; os << " "
<< std::min(static_cast<size_t>(static_cast<float>(progress_) / max_progress * 100),
size_t(100))
<< "%";
} }
auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>(); auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>();
@@ -2064,7 +1989,8 @@ public:
if (saved_start_time) { if (saved_start_time) {
auto eta = std::chrono::nanoseconds( auto eta = std::chrono::nanoseconds(
progress_ > 0 ? static_cast<long long>(elapsed_.count() * max_progress / progress_) : 0); progress_ > 0 ? static_cast<long long>(elapsed_.count() * max_progress / progress_)
: 0);
auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta); auto remaining = eta > elapsed_ ? (eta - elapsed_) : (elapsed_ - eta);
details::write_duration(os, remaining); details::write_duration(os, remaining);
} else { } else {
@@ -2080,13 +2006,12 @@ public:
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
os << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << "\r";
<< "\r";
os.flush(); os.flush();
if ((type == ProgressType::incremental && progress_ >= max_progress) || if ((type == ProgressType::incremental && progress_ >= max_progress) ||
(type == ProgressType::decremental && progress_ <= min_progress)) { (type == ProgressType::decremental && progress_ <= min_progress)) {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;
} }
if (get_value<details::ProgressBarOption::completed>() && if (get_value<details::ProgressBarOption::completed>() &&
!from_multi_progress) // Don't std::endl if calling from MultiProgress !from_multi_progress) // Don't std::endl if calling from MultiProgress
os << termcolor::reset << std::endl; os << termcolor::reset << std::endl;
@@ -2151,11 +2076,10 @@ public:
option::MaxPostfixTextLen{0}, std::forward<Args>(args)...), option::MaxPostfixTextLen{0}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::font_styles>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_progress>(option::MaxProgress{100}, details::get<details::ProgressBarOption::max_progress>(
std::forward<Args>(args)...), option::MaxProgress{100}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>( details::get<details::ProgressBarOption::stream>(option::Stream{std::cout},
option::Stream{std::cout}, std::forward<Args>(args)...) std::forward<Args>(args)...)) {}
) {}
template <typename T, details::ProgressBarOption id> template <typename T, details::ProgressBarOption id>
void set_option(details::Setting<T, id> &&setting) { void set_option(details::Setting<T, id> &&setting) {
@@ -2214,7 +2138,8 @@ public:
size_t current() { size_t current() {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
return std::min(static_cast<size_t>(progress_), size_t(get_value<details::ProgressBarOption::max_progress>())); return std::min(static_cast<size_t>(progress_),
size_t(get_value<details::ProgressBarOption::max_progress>()));
} }
bool is_completed() const { return get_value<details::ProgressBarOption::completed>(); } bool is_completed() const { return get_value<details::ProgressBarOption::completed>(); }
@@ -2259,7 +2184,7 @@ public:
void print_progress(bool from_multi_progress = false) { void print_progress(bool from_multi_progress = false) {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>(); auto &os = get_value<details::ProgressBarOption::stream>();
const auto max_progress = get_value<details::ProgressBarOption::max_progress>(); const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
if (multi_progress_mode_ && !from_multi_progress) { if (multi_progress_mode_ && !from_multi_progress) {
@@ -2277,7 +2202,7 @@ public:
for (auto &style : get_value<details::ProgressBarOption::font_styles>()) for (auto &style : get_value<details::ProgressBarOption::font_styles>())
details::set_font_style(os, style); details::set_font_style(os, style);
os << get_value<details::ProgressBarOption::prefix_text>(); os << get_value<details::ProgressBarOption::prefix_text>();
os << get_value<details::ProgressBarOption::start>(); os << get_value<details::ProgressBarOption::start>();
@@ -2287,7 +2212,8 @@ public:
os << get_value<details::ProgressBarOption::end>(); os << get_value<details::ProgressBarOption::end>();
if (get_value<details::ProgressBarOption::show_percentage>()) { if (get_value<details::ProgressBarOption::show_percentage>()) {
os << " " << std::min(static_cast<size_t>(progress_ / max_progress * 100.0), size_t(100)) << "%"; os << " " << std::min(static_cast<size_t>(progress_ / max_progress * 100.0), size_t(100))
<< "%";
} }
auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>(); auto &saved_start_time = get_value<details::ProgressBarOption::saved_start_time>();
@@ -2324,8 +2250,7 @@ public:
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
os << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << "\r";
<< "\r";
os.flush(); os.flush();
if (progress_ > max_progress) { if (progress_ > max_progress) {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;
@@ -2360,14 +2285,10 @@ namespace indicators {
class IndeterminateProgressBar { class IndeterminateProgressBar {
using Settings = using Settings =
std::tuple<option::BarWidth, option::PrefixText, option::PostfixText, option::Start, std::tuple<option::BarWidth, option::PrefixText, option::PostfixText, option::Start,
option::End, option::Fill, option::Lead, option::End, option::Fill, option::Lead, option::MaxPostfixTextLen,
option::MaxPostfixTextLen, option::Completed, option::Completed, option::ForegroundColor, option::FontStyles, option::Stream>;
option::ForegroundColor, option::FontStyles, option::Stream>;
enum class Direction { enum class Direction { forward, backward };
forward,
backward
};
Direction direction_{Direction::forward}; Direction direction_{Direction::forward};
@@ -2399,8 +2320,8 @@ public:
option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...), option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::font_styles>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>( details::get<details::ProgressBarOption::stream>(option::Stream{std::cout},
option::Stream{std::cout}, std::forward<Args>(args)...)) { std::forward<Args>(args)...)) {
// starts with [<==>...........] // starts with [<==>...........]
// progress_ = 0 // progress_ = 0
@@ -2409,10 +2330,10 @@ public:
// ^^^^^^^^^^^^ (bar_width - len(lead)) // ^^^^^^^^^^^^ (bar_width - len(lead))
// progress_ = bar_width - len(lead) // progress_ = bar_width - len(lead)
progress_ = 0; progress_ = 0;
max_progress_ = get_value<details::ProgressBarOption::bar_width>() max_progress_ = get_value<details::ProgressBarOption::bar_width>() -
- get_value<details::ProgressBarOption::lead>().size() get_value<details::ProgressBarOption::lead>().size() +
+ get_value<details::ProgressBarOption::start>().size() get_value<details::ProgressBarOption::start>().size() +
+ get_value<details::ProgressBarOption::end>().size(); get_value<details::ProgressBarOption::end>().size();
} }
template <typename T, details::ProgressBarOption id> template <typename T, details::ProgressBarOption id>
@@ -2469,9 +2390,7 @@ public:
print_progress(); print_progress();
} }
bool is_completed() { bool is_completed() { return get_value<details::ProgressBarOption::completed>(); }
return get_value<details::ProgressBarOption::completed>();
}
void mark_as_completed() { void mark_as_completed() {
get_value<details::ProgressBarOption::completed>() = true; get_value<details::ProgressBarOption::completed>() = true;
@@ -2504,7 +2423,7 @@ public:
void print_progress(bool from_multi_progress = false) { void print_progress(bool from_multi_progress = false) {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>(); auto &os = get_value<details::ProgressBarOption::stream>();
if (multi_progress_mode_ && !from_multi_progress) { if (multi_progress_mode_ && !from_multi_progress) {
return; return;
@@ -2519,10 +2438,10 @@ public:
os << get_value<details::ProgressBarOption::start>(); os << get_value<details::ProgressBarOption::start>();
details::IndeterminateProgressScaleWriter writer{os, details::IndeterminateProgressScaleWriter writer{
get_value<details::ProgressBarOption::bar_width>(), os, get_value<details::ProgressBarOption::bar_width>(),
get_value<details::ProgressBarOption::fill>(), get_value<details::ProgressBarOption::fill>(),
get_value<details::ProgressBarOption::lead>()}; get_value<details::ProgressBarOption::lead>()};
writer.write(progress_); writer.write(progress_);
os << get_value<details::ProgressBarOption::end>(); os << get_value<details::ProgressBarOption::end>();
@@ -2530,8 +2449,7 @@ public:
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
os << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << "\r";
<< "\r";
os.flush(); os.flush();
if (get_value<details::ProgressBarOption::completed>() && if (get_value<details::ProgressBarOption::completed>() &&
!from_multi_progress) // Don't std::endl if calling from MultiProgress !from_multi_progress) // Don't std::endl if calling from MultiProgress
@@ -2764,36 +2682,37 @@ public:
Settings, typename std::decay<Args>::type...>::value, Settings, typename std::decay<Args>::type...>::value,
void *>::type = nullptr> void *>::type = nullptr>
explicit ProgressSpinner(Args &&... args) explicit ProgressSpinner(Args &&... args)
: settings_(details::get<details::ProgressBarOption::foreground_color>( : settings_(
option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...), details::get<details::ProgressBarOption::foreground_color>(
details::get<details::ProgressBarOption::prefix_text>( option::ForegroundColor{Color::unspecified}, std::forward<Args>(args)...),
option::PrefixText{}, std::forward<Args>(args)...), details::get<details::ProgressBarOption::prefix_text>(option::PrefixText{},
details::get<details::ProgressBarOption::postfix_text>( std::forward<Args>(args)...),
option::PostfixText{}, std::forward<Args>(args)...), details::get<details::ProgressBarOption::postfix_text>(option::PostfixText{},
details::get<details::ProgressBarOption::show_percentage>( std::forward<Args>(args)...),
option::ShowPercentage{true}, std::forward<Args>(args)...), details::get<details::ProgressBarOption::show_percentage>(option::ShowPercentage{true},
details::get<details::ProgressBarOption::show_elapsed_time>(
option::ShowElapsedTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::show_remaining_time>(
option::ShowRemainingTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::spinner_show>(
option::ShowSpinner{true}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::saved_start_time>(
option::SavedStartTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::completed>(option::Completed{false},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_postfix_text_len>( details::get<details::ProgressBarOption::show_elapsed_time>(
option::MaxPostfixTextLen{0}, std::forward<Args>(args)...), option::ShowElapsedTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::spinner_states>( details::get<details::ProgressBarOption::show_remaining_time>(
option::SpinnerStates{std::vector<std::string>{"", "", "", "", "", "", option::ShowRemainingTime{false}, std::forward<Args>(args)...),
"", "", "", ""}}, details::get<details::ProgressBarOption::spinner_show>(option::ShowSpinner{true},
std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>( details::get<details::ProgressBarOption::saved_start_time>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...), option::SavedStartTime{false}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_progress>( details::get<details::ProgressBarOption::completed>(option::Completed{false},
option::MaxProgress{100}, std::forward<Args>(args)...), std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>( details::get<details::ProgressBarOption::max_postfix_text_len>(
option::Stream{std::cout}, std::forward<Args>(args)...)) {} option::MaxPostfixTextLen{0}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::spinner_states>(
option::SpinnerStates{
std::vector<std::string>{"", "", "", "", "", "", "", "", "", ""}},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::font_styles>(
option::FontStyles{std::vector<FontStyle>{}}, std::forward<Args>(args)...),
details::get<details::ProgressBarOption::max_progress>(option::MaxProgress{100},
std::forward<Args>(args)...),
details::get<details::ProgressBarOption::stream>(option::Stream{std::cout},
std::forward<Args>(args)...)) {}
template <typename T, details::ProgressBarOption id> template <typename T, details::ProgressBarOption id>
void set_option(details::Setting<T, id> &&setting) { void set_option(details::Setting<T, id> &&setting) {
@@ -2894,7 +2813,7 @@ public:
void print_progress() { void print_progress() {
std::lock_guard<std::mutex> lock{mutex_}; std::lock_guard<std::mutex> lock{mutex_};
auto& os = get_value<details::ProgressBarOption::stream>(); auto &os = get_value<details::ProgressBarOption::stream>();
const auto max_progress = get_value<details::ProgressBarOption::max_progress>(); const auto max_progress = get_value<details::ProgressBarOption::max_progress>();
auto now = std::chrono::high_resolution_clock::now(); auto now = std::chrono::high_resolution_clock::now();
@@ -2937,8 +2856,7 @@ public:
if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0) if (get_value<details::ProgressBarOption::max_postfix_text_len>() == 0)
get_value<details::ProgressBarOption::max_postfix_text_len>() = 10; get_value<details::ProgressBarOption::max_postfix_text_len>() = 10;
os << " " << get_value<details::ProgressBarOption::postfix_text>() os << " " << get_value<details::ProgressBarOption::postfix_text>()
<< std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << std::string(get_value<details::ProgressBarOption::max_postfix_text_len>(), ' ') << "\r";
<< "\r";
os.flush(); os.flush();
index_ += 1; index_ += 1;
if (progress_ > max_progress) { if (progress_ > max_progress) {