Skip to content

Commit 1f9b1a6

Browse files
committed
from_chars_advanced overload function taking parsed_number_string_t
1 parent 1fc3ac3 commit 1f9b1a6

File tree

1 file changed

+35
-22
lines changed

1 file changed

+35
-22
lines changed

include/fast_float/parse_number.h

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -189,33 +189,13 @@ from_chars_result_t<UC> from_chars(UC const * first, UC const * last,
189189

190190
template<typename T, typename UC>
191191
FASTFLOAT_CONSTEXPR20
192-
from_chars_result_t<UC> from_chars_advanced(UC const * first, UC const * last,
193-
T &value, parse_options_t<UC> options) noexcept {
192+
from_chars_result_t<UC> from_chars_advanced(parsed_number_string_t<UC>& pns,
193+
T &value) noexcept {
194194

195195
static_assert (is_supported_float_type<T>(), "only some floating-point types are supported");
196196
static_assert (is_supported_char_type<UC>(), "only char, wchar_t, char16_t and char32_t are supported");
197197

198198
from_chars_result_t<UC> answer;
199-
#ifdef FASTFLOAT_SKIP_WHITE_SPACE // disabled by default
200-
while ((first != last) && fast_float::is_space(uint8_t(*first))) {
201-
first++;
202-
}
203-
#endif
204-
if (first == last) {
205-
answer.ec = std::errc::invalid_argument;
206-
answer.ptr = first;
207-
return answer;
208-
}
209-
parsed_number_string_t<UC> pns = parse_number_string<UC>(first, last, options);
210-
if (!pns.valid) {
211-
if (options.format & chars_format::no_infnan) {
212-
answer.ec = std::errc::invalid_argument;
213-
answer.ptr = first;
214-
return answer;
215-
} else {
216-
return detail::parse_infnan(first, last, value);
217-
}
218-
}
219199

220200
answer.ec = std::errc(); // be optimistic
221201
answer.ptr = pns.lastmatch;
@@ -276,6 +256,39 @@ from_chars_result_t<UC> from_chars_advanced(UC const * first, UC const * last,
276256
return answer;
277257
}
278258

259+
template<typename T, typename UC>
260+
FASTFLOAT_CONSTEXPR20
261+
from_chars_result_t<UC> from_chars_advanced(UC const * first, UC const * last,
262+
T &value, parse_options_t<UC> options) noexcept {
263+
264+
static_assert (is_supported_float_type<T>(), "only some floating-point types are supported");
265+
static_assert (is_supported_char_type<UC>(), "only char, wchar_t, char16_t and char32_t are supported");
266+
267+
from_chars_result_t<UC> answer;
268+
#ifdef FASTFLOAT_SKIP_WHITE_SPACE // disabled by default
269+
while ((first != last) && fast_float::is_space(uint8_t(*first))) {
270+
first++;
271+
}
272+
#endif
273+
if (first == last) {
274+
answer.ec = std::errc::invalid_argument;
275+
answer.ptr = first;
276+
return answer;
277+
}
278+
parsed_number_string_t<UC> pns = parse_number_string<UC>(first, last, options);
279+
if (!pns.valid) {
280+
if (options.format & chars_format::no_infnan) {
281+
answer.ec = std::errc::invalid_argument;
282+
answer.ptr = first;
283+
return answer;
284+
} else {
285+
return detail::parse_infnan(first, last, value);
286+
}
287+
}
288+
289+
return from_chars_advanced(pns, value);
290+
}
291+
279292

280293
template <typename T, typename UC, typename>
281294
FASTFLOAT_CONSTEXPR20

0 commit comments

Comments
 (0)