summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-08-18 21:06:53 +0100
committerMaxime Coste <frrrwww@gmail.com>2015-08-18 21:06:53 +0100
commita33c8d9677ae81375f8e9567efc5b3e14ae026f5 (patch)
treeb6f412d75db7c5e0fdec0872ef54fe7e8d1c7701 /src
parent386f41e1c59cbd441ab2a4dcfc8ac95f5726105a (diff)
Smaller sizeof for in place strings
Diffstat (limited to 'src')
-rw-r--r--src/string.cc20
-rw-r--r--src/string.hh18
2 files changed, 20 insertions, 18 deletions
diff --git a/src/string.cc b/src/string.cc
index d9689938..682a6947 100644
--- a/src/string.cc
+++ b/src/string.cc
@@ -138,37 +138,37 @@ int str_to_int(StringView str)
throw runtime_error{str + " is not a number"};
}
-InplaceString<16> to_string(int val)
+InplaceString<15> to_string(int val)
{
- InplaceString<16> res;
+ InplaceString<15> res;
res.m_length = sprintf(res.m_data, "%i", val);
return res;
}
-InplaceString<24> to_string(size_t val)
+InplaceString<23> to_string(size_t val)
{
- InplaceString<24> res;
+ InplaceString<23> res;
res.m_length = sprintf(res.m_data, "%zu", val);
return res;
}
-InplaceString<24> to_string(Hex val)
+InplaceString<23> to_string(Hex val)
{
- InplaceString<24> res;
+ InplaceString<23> res;
res.m_length = sprintf(res.m_data, "%zx", val.val);
return res;
}
-InplaceString<24> to_string(float val)
+InplaceString<23> to_string(float val)
{
- InplaceString<24> res;
+ InplaceString<23> res;
res.m_length = sprintf(res.m_data, "%f", val);
return res;
}
-InplaceString<8> to_string(Codepoint c)
+InplaceString<7> to_string(Codepoint c)
{
- InplaceString<8> res;
+ InplaceString<7> res;
char* ptr = res.m_data;
utf8::dump(ptr, c);
res.m_length = (int)(ptr - res.m_data);
diff --git a/src/string.hh b/src/string.hh
index c853ebe4..6970e74a 100644
--- a/src/string.hh
+++ b/src/string.hh
@@ -263,21 +263,23 @@ Optional<int> str_to_int_ifp(StringView str);
template<size_t N>
struct InplaceString
{
- constexpr operator StringView() const { return {m_data, m_length}; }
- operator String() const { return {m_data, m_length}; }
+ static_assert(N < 256, "InplaceString cannot handle sizes >= 256");
- ByteCount m_length;
+ constexpr operator StringView() const { return {m_data, ByteCount{m_length}}; }
+ operator String() const { return {m_data, ByteCount{m_length}}; }
+
+ unsigned char m_length;
char m_data[N];
};
struct Hex { size_t val; };
inline Hex hex(size_t val) { return {val}; }
-InplaceString<16> to_string(int val);
-InplaceString<24> to_string(size_t val);
-InplaceString<24> to_string(Hex val);
-InplaceString<24> to_string(float val);
-InplaceString<8> to_string(Codepoint c);
+InplaceString<15> to_string(int val);
+InplaceString<23> to_string(size_t val);
+InplaceString<23> to_string(Hex val);
+InplaceString<23> to_string(float val);
+InplaceString<7> to_string(Codepoint c);
template<typename RealType, typename ValueType>
decltype(to_string(std::declval<ValueType>()))