From bf14b2c41b78bd6cec78c05b35f310d658d2b986 Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Wed, 25 Feb 2015 07:43:47 -0800 Subject: [PATCH] Try improving error reporting when formatting wide strings into narrow. --- format.h | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/format.h b/format.h index c33f8d52..cb23e7b1 100644 --- a/format.h +++ b/format.h @@ -738,6 +738,20 @@ struct Arg : Value { Type type; }; +struct None {}; + +template +struct WStringHelper { + typedef None Supported; + typedef T Unsupported; +}; + +template +struct WStringHelper { + typedef T Supported; + typedef None Unsupported; +}; + // Makes a Value object from any type. template class MakeValue : public Value { @@ -752,6 +766,8 @@ class MakeValue : public Value { template MakeValue(T *value); + MakeValue(typename WStringHelper::Unsupported); + void set_string(StringRef str) { string.value = str.c_str(); string.size = str.size(); @@ -833,10 +849,17 @@ class MakeValue : public Value { FMT_MAKE_STR_VALUE(const std::string &, STRING) FMT_MAKE_STR_VALUE(StringRef, STRING) - FMT_MAKE_STR_VALUE(wchar_t *, WSTRING) - FMT_MAKE_STR_VALUE(const wchar_t *, WSTRING) - FMT_MAKE_STR_VALUE(const std::wstring &, WSTRING) - FMT_MAKE_STR_VALUE(WStringRef, WSTRING) + MakeValue(wchar_t *value) { set_string(value); } + MakeValue(typename WStringHelper::Supported value) { + set_string(value); + } + MakeValue(const std::wstring &value) { set_string(value); } + MakeValue(WStringRef value) { set_string(value); } + + static uint64_t type(wchar_t *) { return Arg::WSTRING; } + static uint64_t type(const wchar_t *) { return Arg::WSTRING; } + static uint64_t type(const std::wstring &) { return Arg::WSTRING; } + static uint64_t type(WStringRef) { return Arg::WSTRING; } FMT_MAKE_VALUE(void *, pointer, POINTER) FMT_MAKE_VALUE(const void *, pointer, POINTER)