aboutsummaryrefslogtreecommitdiff
path: root/src/util/format.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/format.hpp')
-rw-r--r--src/util/format.hpp42
1 files changed, 24 insertions, 18 deletions
diff --git a/src/util/format.hpp b/src/util/format.hpp
index 874c5b43..7c1cee05 100644
--- a/src/util/format.hpp
+++ b/src/util/format.hpp
@@ -5,26 +5,29 @@
namespace cru::util {
namespace details {
-constexpr StringView PlaceHolder(type_tag<String>) { return StringView(L"{}"); }
+template <typename T>
+struct TypeTag {};
-constexpr MultiByteStringView PlaceHolder(type_tag<MultiByteString>) {
+constexpr StringView PlaceHolder(TypeTag<String>) { return StringView(L"{}"); }
+
+constexpr MultiByteStringView PlaceHolder(TypeTag<MultiByteString>) {
return MultiByteStringView("{}");
}
template <typename TString>
void FormatInternal(TString& string) {
- const auto find_result = string.find(PlaceHolder(type_tag<TString>{}));
+ const auto find_result = string.find(PlaceHolder(TypeTag<TString>{}));
if (find_result != TString::npos)
throw std::invalid_argument("There is more placeholders than args.");
}
template <typename TString, typename T, typename... TRest>
void FormatInternal(TString& string, const T& arg, const TRest&... args) {
- const auto find_result = string.find(PlaceHolder(type_tag<TString>{}));
+ const auto find_result = string.find(PlaceHolder(TypeTag<TString>{}));
if (find_result == TString::npos)
throw std::invalid_argument("There is less placeholders than args.");
- string.replace(find_result, 2, FormatToString(arg, type_tag<TString>{}));
+ string.replace(find_result, 2, FormatToString(arg, TypeTag<TString>{}));
FormatInternal<TString>(string, args...);
}
} // namespace details
@@ -43,13 +46,13 @@ MultiByteString Format(const MultiByteStringView& format, const T&... args) {
return result;
}
-#define CRU_FORMAT_NUMBER(type) \
- inline String FormatToString(const type number, type_tag<String>) { \
- return std::to_wstring(number); \
- } \
- inline MultiByteString FormatToString(const type number, \
- type_tag<MultiByteString>) { \
- return std::to_string(number); \
+#define CRU_FORMAT_NUMBER(type) \
+ inline String FormatToString(const type number, details::TypeTag<String>) { \
+ return std::to_wstring(number); \
+ } \
+ inline MultiByteString FormatToString(const type number, \
+ details::TypeTag<MultiByteString>) { \
+ return std::to_string(number); \
}
CRU_FORMAT_NUMBER(int)
@@ -65,30 +68,33 @@ CRU_FORMAT_NUMBER(double)
#undef CRU_FORMAT_NUMBER
-inline StringView FormatToString(const String& string, type_tag<String>) {
+inline StringView FormatToString(const String& string,
+ details::TypeTag<String>) {
return string;
}
inline MultiByteString FormatToString(const MultiByteString& string,
- type_tag<MultiByteString>) {
+ details::TypeTag<MultiByteString>) {
return string;
}
-inline StringView FormatToString(const StringView& string, type_tag<String>) {
+inline StringView FormatToString(const StringView& string,
+ details::TypeTag<String>) {
return string;
}
inline MultiByteStringView FormatToString(const MultiByteStringView& string,
- type_tag<MultiByteString>) {
+ details::TypeTag<MultiByteString>) {
return string;
}
-inline StringView FormatToString(const wchar_t* string, type_tag<String>) {
+inline StringView FormatToString(const wchar_t* string,
+ details::TypeTag<String>) {
return StringView(string);
}
inline MultiByteStringView FormatToString(const char* string,
- type_tag<MultiByteString>) {
+ details::TypeTag<MultiByteString>) {
return MultiByteString(string);
}
} // namespace cru::util