sstring: fix to_sstring() for all sstring types

sstring is a family of types (basic_string<...>), make to_sstring work for
all of them.
This commit is contained in:
Avi Kivity
2015-02-23 17:26:10 +02:00
parent fbf8844079
commit 51ff807a11

View File

@@ -338,66 +338,74 @@ static String make_sstring(Args&&... args)
template <typename T, typename String = sstring, typename for_enable_if = void*>
String to_sstring(T value, for_enable_if);
template <typename T>
template <typename string_type, typename T>
inline
sstring to_sstring_sprintf(T value, const char* fmt) {
string_type to_sstring_sprintf(T value, const char* fmt) {
char tmp[sizeof(value) * 3 + 3];
auto len = std::sprintf(tmp, fmt, value);
return sstring(tmp, len);
using char_type = typename string_type::value_type;
return string_type(reinterpret_cast<char_type*>(tmp), len);
}
template <typename T>
inline
sstring
to_sstring_sprintf(T value, const char* fmt) {
return to_sstring_sprintf<sstring>(value, fmt);
}
template <typename string_type = sstring>
inline
string_type to_sstring(int value, void* = nullptr) {
return to_sstring_sprintf(value, "%d");
return to_sstring_sprintf<string_type>(value, "%d");
}
template <typename string_type = sstring>
inline
string_type to_sstring(unsigned value, void* = nullptr) {
return to_sstring_sprintf(value, "%u");
return to_sstring_sprintf<string_type>(value, "%u");
}
template <typename string_type = sstring>
inline
string_type to_sstring(long value, void* = nullptr) {
return to_sstring_sprintf(value, "%ld");
return to_sstring_sprintf<string_type>(value, "%ld");
}
template <typename string_type = sstring>
inline
string_type to_sstring(unsigned long value, void* = nullptr) {
return to_sstring_sprintf(value, "%lu");
return to_sstring_sprintf<string_type>(value, "%lu");
}
template <typename string_type = sstring>
inline
string_type to_sstring(long long value, void* = nullptr) {
return to_sstring_sprintf(value, "%lld");
return to_sstring_sprintf<string_type>(value, "%lld");
}
template <typename string_type = sstring>
inline
string_type to_sstring(unsigned long long value, void* = nullptr) {
return to_sstring_sprintf(value, "%llu");
return to_sstring_sprintf<string_type>(value, "%llu");
}
template <typename string_type = sstring>
inline
string_type to_sstring(float value, void* = nullptr) {
return to_sstring_sprintf(value, "%f");
return to_sstring_sprintf<string_type>(value, "%f");
}
template <typename string_type = sstring>
inline
string_type to_sstring(double value, void* = nullptr) {
return to_sstring_sprintf(value, "%f");
return to_sstring_sprintf<string_type>(value, "%f");
}
template <typename string_type = sstring>
inline
string_type to_sstring(long double value, void* = nullptr) {
return to_sstring_sprintf(value, "%Lf");
return to_sstring_sprintf<string_type>(value, "%Lf");
}
template <typename string_type = sstring>