summaryrefslogtreecommitdiff
path: root/src/string_utils.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2022-05-05 08:41:48 +1000
committerMaxime Coste <mawww@kakoune.org>2022-05-05 08:42:04 +1000
commitd2f9bc8d80cef5008d989380a5c3237b027f4613 (patch)
treedba69555ab8956d1fb3812c48dfac6b179d4f20b /src/string_utils.cc
parent5c6238ef113da8c2844ff9bcfa27c87e3473c150 (diff)
Use std::to_chars to int to str conversion
Diffstat (limited to 'src/string_utils.cc')
-rw-r--r--src/string_utils.cc47
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)