diff options
Diffstat (limited to 'src/util/format.hpp')
-rw-r--r-- | src/util/format.hpp | 42 |
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 |