29 std::vector<mp_integer> numbers(input_numbers);
30 std::sort(numbers.begin(), numbers.end());
31 if(numbers.front() == numbers.back())
34 std::stringstream number_range;
36 auto start_number = numbers.front();
38 for(std::vector<mp_integer>::const_iterator it = numbers.begin();
42 const auto number = *it;
43 const auto next = std::next(it);
46 if(next != numbers.end() && *next <= number + 1)
50 if(start_number != numbers.front())
53 if(number == start_number)
55 number_range << number;
57 else if(number == start_number + 1)
59 number_range << start_number <<
',' << number;
63 number_range << start_number <<
'-' << number;
66 if(next != numbers.end())
71 return number_range.str();
76 const std::string &number_range,
77 std::vector<mp_integer> &numbers,
78 bool last_number_is_set,
81 if(!last_number_is_set && is_range)
84 "unterminated number range '" +
integer2string(*(++numbers.rbegin())) +
88 if(!last_number_is_set)
91 "invalid number range '" + number_range +
"'");
100 if(begin_range > end_range)
103 "lower bound must not be larger than upper bound '" +
106 for(
mp_integer i = begin_range; i < end_range; ++i)
107 numbers.push_back(i);
110 numbers.push_back(end_range);
116 std::vector<mp_integer> numbers(1, 0);
117 bool last_number_is_set =
false;
118 bool is_range =
false;
120 for(
char c : number_range)
122 if(
'0' <= c && c <=
'9')
124 numbers.back() *= 10;
125 numbers.back() += c -
'0';
126 last_number_is_set =
true;
130 append_numbers(number_range, numbers, last_number_is_set, is_range);
132 numbers.push_back(0);
133 last_number_is_set =
false;
138 if(!last_number_is_set)
141 "lower bound missing in number range '" + number_range +
"'");
143 numbers.push_back(0);
144 last_number_is_set =
false;
150 std::string(
"character '") + c +
"' not allowed in number range");
153 append_numbers(number_range, numbers, last_number_is_set, is_range);