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);
61 return {last, std::errc::value_too_large};
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)
135 buffer[std::min<ptrdiff_t>(buffer_size -
offset, last - first)] =
'\0';
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>
252inline from_chars_result
from_chars(
char const * first,
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;
@ offset
Sequence (seqan3::field::seq) relative start position (0-based), unsigned value.
SeqAn specific customisations in the standard namespace.