18#ifndef TRINITY_STRINGCONVERT_H
19#define TRINITY_STRINGCONVERT_H
34 template <
typename T,
typename =
void>
struct For
36 static_assert(Trinity::dependant_false_v<T>,
"Unsupported type used for ToString or StringTo");
44 struct For<T,
std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>>>
67 char const*
const start = str.data();
68 char const*
const end = (start + str.length());
71 std::from_chars_result
const res = std::from_chars(start, end, val, base);
72 if ((res.ptr == end) && (res.ec == std::errc()))
80 using buffer_size = std::integral_constant<size_t,
sizeof(T) < 8 ? 11 : 20>;
82 std::string buf(buffer_size::value,
'\0');
83 char*
const start = buf.data();
84 char*
const end = (start + buf.length());
85 std::to_chars_result
const res = std::to_chars(start, end, val);
86 ASSERT(res.ec == std::errc());
87 buf.resize(res.ptr - start);
92#ifdef TRINITY_NEED_CHARCONV_WORKAROUND
110 uint64 val = std::stoull(std::string(str), &n, base);
111 if (n != str.length())
115 catch (...) {
return std::nullopt; }
120 return std::to_string(val);
125 struct For<
int64, void>
133 int64 val = std::stoll(std::string(str), &n, base);
134 if (n != str.length())
138 catch (...) {
return std::nullopt; }
143 return std::to_string(val);
173 return (val ?
"1" :
"0");
177#if TRINITY_COMPILER == TRINITY_COMPILER_MICROSOFT
178 template <
typename T>
179 struct For<T,
std::enable_if_t<std::is_floating_point_v<T>>>
186 if (
fmt == std::chars_format())
190 fmt = std::chars_format::hex;
191 str.remove_prefix(2);
194 fmt = std::chars_format::general;
200 char const*
const start = str.data();
201 char const*
const end = (start + str.length());
204 std::from_chars_result
const res = std::from_chars(start, end, val,
fmt);
205 if ((res.ptr == end) && (res.ec == std::errc()))
215 return FromString(str, std::chars_format::hex);
217 return FromString(str, std::chars_format::general);
219 return FromString(str, std::chars_format());
224 return std::to_string(val);
229 template <
typename T>
230 struct For<T,
std::enable_if_t<std::is_floating_point_v<T>>>
232 static Optional<T> FromString(std::string_view str,
int base = 0)
238 if ((base == 10) &&
StringEqualI(str.substr(0, 2),
"0x"))
247 T val =
static_cast<T
>(std::stold(tmp, &n));
248 if (n != tmp.length())
252 catch (...) {
return std::nullopt; }
257 return std::to_string(val);
265 template <
typename Result,
typename... Params>
271 template <
typename Type,
typename... Params>
std::unordered_set< uint32 > params[2]
std::optional< T > Optional
Optional helper class to wrap optional values within.
TC_COMMON_API bool StringEqualI(std::string_view str1, std::string_view str2)
std::string ToString(Type &&val, Params &&... params)
Optional< Result > StringTo(std::string_view str, Params &&... params)
static Optional< T > FromString(std::string_view str, int base=10)
static std::string ToString(T val)
static Optional< T > FromString(std::string_view str, int base)
static Optional< T > FromString(std::string_view str, std::chars_format fmt=std::chars_format())
static std::string ToString(T val)
static Optional< bool > FromString(std::string_view str, int strict=0)
static std::string ToString(bool val)