56 auto valid = [&] (
unsigned val) {
60 auto clamp_to_valid = [&] (
unsigned val) {
61 val = std::max(val,
start);
63 val = std::min(val,
end);
68 std::set<unsigned> out;
70 auto add = [&] (
unsigned val) {
74 auto add_if_valid = [&] (
unsigned val) {
80 static auto const regex = Glib::Regex::create(
"\\s*(((\\d*)\\s*-\\s*(\\d*))|(\\d+))\\s*,?", Glib::Regex::CompileFlags::OPTIMIZE | Glib::Regex::CompileFlags::ANCHORED);
82 auto pos = input.data();
85 while (regex->match(pos, m)) {
86 if (
auto const single = fetch(m, 5); !single.empty()) {
87 add_if_valid(from_chars<unsigned>(single));
88 }
else if (
auto const range = fetch(m, 2); !range.empty()) {
89 auto const first = fetch(m, 3);
90 auto const last = fetch(m, 4);
91 auto const first_num = first.empty() ?
start : from_chars<unsigned>(first);
92 auto const last_num = last.empty() ? (
end ?
end : first_num) : from_chars<unsigned>(last);
93 auto const min = clamp_to_valid(std::min(first_num, last_num));
94 auto const max = clamp_to_valid(std::max(first_num, last_num));
95 for (
auto i = min; i <= max; i++) {
102 pos = fetch(m, 0).end();