11#ifndef SEQAN_STD_CHARCONV_SHIM
12#define SEQAN_STD_CHARCONV_SHIM
36#if __cpp_lib_to_chars < 201611
41namespace seqan3::contrib::charconv_float
43using ::std::chars_format;
44using ::std::from_chars_result;
45using ::std::to_chars_result;
50template <std::
floating_po
int value_type>
51inline to_chars_result to_chars_floating_point(
char * first,
char * last, value_type value)
noexcept
53 assert(first !=
nullptr);
54 assert(last !=
nullptr);
56 std::ostringstream ss;
60 if (last - first <
static_cast<std::ptrdiff_t
>(str.size()))
61 return {last, std::errc::value_too_large};
65 return {first + str.size(), std::errc{}};
71template <std::
floating_po
int value_type>
72inline from_chars_result from_chars_floating_point(
char const * first,
75 chars_format fmt = chars_format::general)
noexcept
85 return {last, std::errc::invalid_argument};
88 constexpr ptrdiff_t buffer_size = 100;
89 char buffer[buffer_size];
91 if (fmt != chars_format::general)
93 bool exponent_is_present{
false};
94 for (
auto it = first; it != last; ++it)
96 if (*it ==
'e' || *it ==
'E')
98 exponent_is_present =
true;
103 if (fmt == chars_format::scientific && !exponent_is_present)
104 return {last, std::errc::invalid_argument};
106 if (fmt == chars_format::fixed && exponent_is_present)
107 return {last, std::errc::invalid_argument};
117 if ((*last !=
'\0') || fmt == chars_format::hex)
127 if (fmt == chars_format::hex)
141 start =
const_cast<char *
>(first);
146 if constexpr (std::same_as<std::remove_reference_t<value_type>,
float>)
148 tmp =
strtof(start, &end);
150 if constexpr (std::same_as<std::remove_reference_t<value_type>,
double>)
152 tmp =
strtod(start, &end);
154 if constexpr (std::same_as<std::remove_reference_t<value_type>,
long double>)
159 last = first + (
end - start);
163 return {last, std::errc::result_out_of_range};
165 else if (tmp == 0 && end == start)
167 return {last, std::errc::invalid_argument};
177namespace seqan3::contrib::charconv_float
186template <std::
floating_po
int floating_po
int_type>
187inline to_chars_result
to_chars(
char * first,
char * last, floating_point_type value)
noexcept
189 return to_chars_floating_point(first, last, value);
251template <std::
floating_po
int floating_po
int_type>
254 floating_point_type & value,
255 chars_format fmt = chars_format::general)
noexcept
257 return from_chars_floating_point(first, last, value, fmt);
265using ::seqan3::contrib::charconv_float::from_chars;
266using ::seqan3::contrib::charconv_float::to_chars;
The <charconv> header from C++17's standard library.
@ offset
Sequence (seqan3::field::seq) relative start position (0-based), unsigned value.
Definition record.hpp:66
SeqAn specific customisations in the standard namespace.
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:252
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:187