diff options
| author | Maxime Coste <mawww@kakoune.org> | 2022-05-05 08:41:48 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2022-05-05 08:42:04 +1000 |
| commit | d2f9bc8d80cef5008d989380a5c3237b027f4613 (patch) | |
| tree | dba69555ab8956d1fb3812c48dfac6b179d4f20b /src/string_utils.cc | |
| parent | 5c6238ef113da8c2844ff9bcfa27c87e3473c150 (diff) | |
Use std::to_chars to int to str conversion
Diffstat (limited to 'src/string_utils.cc')
| -rw-r--r-- | src/string_utils.cc | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/src/string_utils.cc b/src/string_utils.cc index 37ca6716..0b0c113c 100644 --- a/src/string_utils.cc +++ b/src/string_utils.cc @@ -4,6 +4,7 @@ #include "utf8_iterator.hh" #include "unit_tests.hh" +#include <charconv> #include <cstdio> namespace Kakoune @@ -146,53 +147,57 @@ int str_to_int(StringView str) throw runtime_error{str + " is not a number"}; } -InplaceString<15> to_string(int val) +template<size_t N> +InplaceString<N> to_string_impl(auto val, auto format) { - InplaceString<15> res; - res.m_length = sprintf(res.m_data, "%i", val); + InplaceString<N> res; + auto [end, errc] = std::to_chars(res.m_data, res.m_data + N, val, format); + if (errc != std::errc{}) + throw runtime_error("to_string error"); + res.m_length = end - res.m_data; + *end = '\0'; return res; } +template<size_t N> +InplaceString<N> to_string_impl(auto val) +{ + return to_string_impl<N>(val, 10); +} + +InplaceString<15> to_string(int val) +{ + return to_string_impl<15>(val); +} + InplaceString<15> to_string(unsigned val) { - InplaceString<15> res; - res.m_length = sprintf(res.m_data, "%u", val); - return res; + return to_string_impl<15>(val); } InplaceString<23> to_string(long int val) { - InplaceString<23> res; - res.m_length = sprintf(res.m_data, "%li", val); - return res; + return to_string_impl<23>(val); } InplaceString<23> to_string(long long int val) { - InplaceString<23> res; - res.m_length = sprintf(res.m_data, "%lli", val); - return res; + return to_string_impl<23>(val); } InplaceString<23> to_string(unsigned long val) { - InplaceString<23> res; - res.m_length = sprintf(res.m_data, "%lu", val); - return res; + return to_string_impl<23>(val); } InplaceString<23> to_string(Hex val) { - InplaceString<23> res; - res.m_length = sprintf(res.m_data, "%zx", val.val); - return res; + return to_string_impl<23>(val.val, 16); } InplaceString<23> to_string(float val) { - InplaceString<23> res; - res.m_length = sprintf(res.m_data, "%f", val); - return res; + return to_string_impl<23>(val, std::chars_format::general); } InplaceString<7> to_string(Codepoint c) |
