25#include "basic_string.hpp"
34#include <system_error>
38namespace essence::detail {
39 template <
typename T,
typename... Args>
40 requires std::is_arithmetic_v<T>
41 std::optional<T> from_string(std::string_view str, Args&&... args)
43 T number) { std::from_chars(str.data(), str.data() + str.size(), number, std::forward<Args>(args)...); }
49 if (T result{}; std::from_chars(str.data(), str.data() + str.size(), result, std::forward<Args>(args)...).ec
57 template <std_basic_string S,
typename T,
typename... Args>
58 requires std::is_arithmetic_v<T>
59 S to_string(T number, Args&&... args)
60 requires requires(
char* str) { std::to_chars(str, str, number, std::forward<Args>(args)...); }
62 thread_local std::array<char, 64> buffer{};
64 if (
auto&& [ptr, ec] =
65 std::to_chars(buffer.data(), buffer.data() + buffer.size(), number, std::forward<Args>(args)...);
67 return {buffer.data(), ptr};
82 template <std::
integral T>
83 std::optional<T> from_string(std::string_view str, std::int32_t base = 10) {
84 return detail::from_string<T>(str, base);
94 template <std::
floating_po
int T>
95 std::optional<T> from_string(std::string_view str, std::chars_format format = std::chars_format::general) {
96 return detail::from_string<T>(str, format);
107 template <std_basic_
string S = std::
string, std::
integral T>
108 S to_string(T number, std::int32_t base = 10) {
109 return detail::to_string<S>(number, base);
119 template <std_basic_
string S = std::
string, std::
floating_po
int T>
120 S to_string(T number) {
121 return detail::to_string<S>(number);
132 template <std_basic_
string S = std::
string, std::
floating_po
int T>
133 S to_string(T number, std::chars_format format) {
134 return detail::to_string<S>(number, format);
146 template <std_basic_
string S = std::
string, std::
floating_po
int T>
147 S to_string(T number, std::chars_format format, std::int32_t precision) {
148 return detail::to_string<S>(number, format, precision);