29 std::vector<unsigned> numbers(input_numbers);
30 std::sort(numbers.begin(), numbers.end());
31 unsigned end_number=numbers.back();
32 if(numbers.front()==end_number)
35 std::stringstream number_range;
37 auto start_number = numbers.front();
39 for(std::vector<unsigned>::const_iterator it = numbers.begin();
43 const auto number = *it;
44 const auto next = std::next(it);
47 if(next != numbers.end() && *next <= number + 1)
51 if(start_number != numbers.front())
54 if(number == start_number)
56 number_range << number;
58 else if(number == start_number + 1)
60 number_range << start_number <<
',' << number;
64 number_range << start_number <<
'-' << number;
67 if(next != numbers.end())
72 return number_range.str();
77 const std::string &number_range,
78 std::vector<unsigned> &numbers,
82 if(!number.has_value() && begin_range.has_value())
85 "unterminated number range '" +
std::to_string(*begin_range) +
"-'");
88 if(!number.has_value())
91 "invalid number range '" + number_range +
"'");
94 if(number.has_value() && begin_range.has_value())
96 if(*begin_range > *number)
99 "lower bound must not be larger than upper bound '" +
102 for(
unsigned i = *begin_range; i < *number; ++i)
103 numbers.push_back(i);
106 numbers.push_back(*number);
110 else if(number.has_value() && !begin_range.has_value())
112 numbers.push_back(*number);
119 std::vector<unsigned> numbers;
123 for(
char c : number_range)
125 if(
'0' <= c && c <=
'9')
127 if(!number.has_value())
129 *number = 10 * *number + (c -
'0');
137 if(!number.has_value())
140 "lower bound missing in number range '" + number_range +
"'");
142 begin_range = number;
148 std::string(
"character '") + c +
"' not allowed in number range");