@@ -73,82 +73,85 @@ std::string format_number_range(const std::vector<unsigned> &input_numbers)
73
73
}
74
74
75
75
// / Appends \p number resp. numbers \p begin_range ... \p number to \p numbers
76
- static void append_numbers_and_reset (
76
+ static void append_numbers (
77
77
const std::string &number_range,
78
78
std::vector<unsigned > &numbers,
79
- optionalt< unsigned > &begin_range ,
80
- optionalt< unsigned > &number )
79
+ bool last_number_is_set ,
80
+ bool is_range )
81
81
{
82
- if (!number. has_value () && begin_range. has_value () )
82
+ if (!last_number_is_set && is_range )
83
83
{
84
84
throw deserialization_exceptiont (
85
- " unterminated number range '" + std::to_string (*begin_range) + " -'" );
85
+ " unterminated number range '" + std::to_string (*(++numbers.rbegin ())) +
86
+ " -'" );
86
87
}
87
88
88
- if (!number. has_value () )
89
+ if (!last_number_is_set )
89
90
{
90
91
throw deserialization_exceptiont (
91
92
" invalid number range '" + number_range + " '" );
92
93
}
93
94
94
- if (number. has_value () && begin_range. has_value () )
95
+ if (is_range )
95
96
{
96
- if (*begin_range > *number)
97
+ unsigned end_range = numbers.back ();
98
+ numbers.pop_back ();
99
+ unsigned begin_range = numbers.back ();
100
+ numbers.pop_back ();
101
+ if (begin_range > end_range)
97
102
{
98
103
throw deserialization_exceptiont (
99
104
" lower bound must not be larger than upper bound '" +
100
- std::to_string (* begin_range) + " -" + std::to_string (*number ) + " '" );
105
+ std::to_string (begin_range) + " -" + std::to_string (end_range ) + " '" );
101
106
}
102
- for (unsigned i = * begin_range; i < *number ; ++i)
107
+ for (unsigned i = begin_range; i < end_range ; ++i)
103
108
numbers.push_back (i);
104
109
// add upper bound separately to avoid
105
110
// potential overflow issues in the loop above
106
- numbers.push_back (*number);
107
- begin_range = {};
108
- number = {};
109
- }
110
- else if (number.has_value () && !begin_range.has_value ())
111
- {
112
- numbers.push_back (*number);
113
- number = {};
111
+ numbers.push_back (end_range);
114
112
}
115
113
}
116
114
117
115
std::vector<unsigned > parse_number_range (const std::string &number_range)
118
116
{
119
- std::vector<unsigned > numbers;
117
+ std::vector<unsigned > numbers (1 , 0 );
118
+ bool last_number_is_set = false ;
119
+ bool is_range = false ;
120
120
121
- optionalt<unsigned > begin_range;
122
- optionalt<unsigned > number;
123
121
for (char c : number_range)
124
122
{
125
123
if (' 0' <= c && c <= ' 9' )
126
124
{
127
- if (!number. has_value ())
128
- number = 0 ;
129
- *number = 10 * *number + (c - ' 0 ' ) ;
125
+ numbers. back () *= 10 ;
126
+ numbers. back () += c - ' 0 ' ;
127
+ last_number_is_set = true ;
130
128
}
131
129
else if (c == ' ,' )
132
130
{
133
- append_numbers_and_reset (number_range, numbers, begin_range, number);
131
+ append_numbers (number_range, numbers, last_number_is_set, is_range);
132
+
133
+ numbers.push_back (0 );
134
+ last_number_is_set = false ;
135
+ is_range = false ;
134
136
}
135
137
else if (c == ' -' )
136
138
{
137
- if (!number. has_value () )
139
+ if (!last_number_is_set )
138
140
{
139
141
throw deserialization_exceptiont (
140
142
" lower bound missing in number range '" + number_range + " '" );
141
143
}
142
- begin_range = number;
143
- number = {};
144
+ numbers.push_back (0 );
145
+ last_number_is_set = false ;
146
+ is_range = true ;
144
147
}
145
148
else
146
149
{
147
150
throw deserialization_exceptiont (
148
151
std::string (" character '" ) + c + " ' not allowed in number range" );
149
152
}
150
153
}
151
- append_numbers_and_reset (number_range, numbers, begin_range, number );
154
+ append_numbers (number_range, numbers, last_number_is_set, is_range );
152
155
153
156
return numbers;
154
157
}
0 commit comments