98 chars_format fmt = chars_format::general)
noexcept
108 if (first >= last || *first ==
'+' ||
std::isspace(
static_cast<unsigned char>(*first)))
109 return {first, std::errc::invalid_argument};
111 auto is_exponent = [](
char const c)
113 return c ==
'e' || c ==
'E';
116 bool const is_negative = *first ==
'-';
117 char const *
const digits = first + is_negative;
118 bool const is_inf_or_nan = digits != last && (*digits ==
'i' || *digits ==
'I' || *digits ==
'n' || *digits ==
'N');
122 bool const has_hex_prefix = last - digits >= 2 && digits[0] ==
'0' && (digits[1] ==
'x' || digits[1] ==
'X');
123 char const * parse_last = has_hex_prefix ? digits + 1 : last;
126 if (fmt == chars_format::fixed && !is_inf_or_nan)
127 parse_last =
std::find_if(first, parse_last, is_exponent);
131 ptrdiff_t
const prefix_size = (fmt == chars_format::hex && !is_inf_or_nan) ? 2 : 0;
138 constexpr ptrdiff_t stack_buffer_size = 100;
139 char stack_buffer[stack_buffer_size];
141 ptrdiff_t
const buffer_size = (parse_last - first) + prefix_size + 1;
142 char *
const buffer = [&]()
144 if (buffer_size <= stack_buffer_size)
145 return &stack_buffer[0];
147 heap_buffer.
resize(buffer_size);
148 return heap_buffer.
data();
151 char * buffer_end =
std::copy(first, digits, buffer);
157 buffer_end =
std::copy(digits, parse_last, buffer_end);
162 int const previous_errno = errno;
167 tmp = strtof(buffer, &end);
171 tmp = strtod(buffer, &end);
175 tmp = strtold(buffer, &end);
178 bool const is_out_of_range = errno == ERANGE;
179 errno = previous_errno;
185 return {first, std::errc::invalid_argument};
188 if (fmt == chars_format::scientific && !is_inf_or_nan &&
std::find_if(first, ptr, is_exponent) == ptr)
189 return {first, std::errc::invalid_argument};
192 return {ptr, std::errc::result_out_of_range};
to_chars_result to_chars(char *first, char *last, floating_point_type value) noexcept
std::to_chars overload for floating point via a std::stringstream for default base = 10.
Definition charconv:212
from_chars_result from_chars_floating_point(char const *first, char const *last, value_type &value, chars_format fmt=chars_format::general) noexcept
Delegates to functions strto[d/f/ld] for floating point value extraction.
Definition charconv:95
to_chars_result to_chars_floating_point(char *first, char *last, value_type value) noexcept
std::to_chars implementation for floating point via a std::stringstream for default base = 10.
Definition charconv:73
from_chars_result from_chars(char const *first, char const *last, floating_point_type &value, chars_format fmt=chars_format::general) noexcept
Parse a char sequence into an floating point value.
Definition charconv:275