Skip to content

Commit ab404f6

Browse files
authored
Merge pull request #6017 from tautschnig/parse_number_range
Refactor parse_number_range to avoid spurious uninitialized warning
2 parents c7b4d21 + ca6f109 commit ab404f6

File tree

1 file changed

+32
-29
lines changed

1 file changed

+32
-29
lines changed

src/util/format_number_range.cpp

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -73,82 +73,85 @@ std::string format_number_range(const std::vector<unsigned> &input_numbers)
7373
}
7474

7575
/// 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(
7777
const std::string &number_range,
7878
std::vector<unsigned> &numbers,
79-
optionalt<unsigned> &begin_range,
80-
optionalt<unsigned> &number)
79+
bool last_number_is_set,
80+
bool is_range)
8181
{
82-
if(!number.has_value() && begin_range.has_value())
82+
if(!last_number_is_set && is_range)
8383
{
8484
throw deserialization_exceptiont(
85-
"unterminated number range '" + std::to_string(*begin_range) + "-'");
85+
"unterminated number range '" + std::to_string(*(++numbers.rbegin())) +
86+
"-'");
8687
}
8788

88-
if(!number.has_value())
89+
if(!last_number_is_set)
8990
{
9091
throw deserialization_exceptiont(
9192
"invalid number range '" + number_range + "'");
9293
}
9394

94-
if(number.has_value() && begin_range.has_value())
95+
if(is_range)
9596
{
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)
97102
{
98103
throw deserialization_exceptiont(
99104
"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) + "'");
101106
}
102-
for(unsigned i = *begin_range; i < *number; ++i)
107+
for(unsigned i = begin_range; i < end_range; ++i)
103108
numbers.push_back(i);
104109
// add upper bound separately to avoid
105110
// 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);
114112
}
115113
}
116114

117115
std::vector<unsigned> parse_number_range(const std::string &number_range)
118116
{
119-
std::vector<unsigned> numbers;
117+
std::vector<unsigned> numbers(1, 0);
118+
bool last_number_is_set = false;
119+
bool is_range = false;
120120

121-
optionalt<unsigned> begin_range;
122-
optionalt<unsigned> number;
123121
for(char c : number_range)
124122
{
125123
if('0' <= c && c <= '9')
126124
{
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;
130128
}
131129
else if(c == ',')
132130
{
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;
134136
}
135137
else if(c == '-')
136138
{
137-
if(!number.has_value())
139+
if(!last_number_is_set)
138140
{
139141
throw deserialization_exceptiont(
140142
"lower bound missing in number range '" + number_range + "'");
141143
}
142-
begin_range = number;
143-
number = {};
144+
numbers.push_back(0);
145+
last_number_is_set = false;
146+
is_range = true;
144147
}
145148
else
146149
{
147150
throw deserialization_exceptiont(
148151
std::string("character '") + c + "' not allowed in number range");
149152
}
150153
}
151-
append_numbers_and_reset(number_range, numbers, begin_range, number);
154+
append_numbers(number_range, numbers, last_number_is_set, is_range);
152155

153156
return numbers;
154157
}

0 commit comments

Comments
 (0)