diff --git a/fmt/format.cc b/fmt/format.cc index de969dc8..d6c6cc7f 100644 --- a/fmt/format.cc +++ b/fmt/format.cc @@ -249,6 +249,7 @@ int CharTraits::format_float( FMT_SNPRINTF(buffer, size, format, width, precision, value); } +#ifdef FMT_HAS_WCHAR_T template int CharTraits::format_float( wchar_t *buffer, std::size_t size, const wchar_t *format, @@ -262,6 +263,7 @@ int CharTraits::format_float( FMT_SWPRINTF(buffer, size, format, width, value) : FMT_SWPRINTF(buffer, size, format, width, precision, value); } +#endif template const char BasicData::DIGITS[] = diff --git a/fmt/format.h b/fmt/format.h index fceb24e7..b72bdc23 100644 --- a/fmt/format.h +++ b/fmt/format.h @@ -109,6 +109,9 @@ typedef __int64 intmax_t; #ifdef __GNUC__ # define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) # define FMT_GCC_EXTENSION __extension__ +# ifndef _GLIBCXX_USE_WCHAR_T +# define FMT_DISABLE_WCHAR_T_SUPPORT +# endif # if FMT_GCC_VERSION >= 406 # pragma GCC diagnostic push // Disable the warning about "long long" which is sometimes reported even @@ -148,6 +151,10 @@ typedef __int64 intmax_t; # pragma clang diagnostic ignored "-Wpadded" #endif +#ifndef FMT_DISABLE_WCHAR_T_SUPPORT +#define FMT_HAS_WCHAR_T 1 +#endif + #ifdef __GNUC_LIBSTD__ # define FMT_GNUC_LIBSTD_VERSION (__GNUC_LIBSTD__ * 100 + __GNUC_LIBSTD_MINOR__) #endif @@ -508,7 +515,9 @@ template class BasicWriter; typedef BasicWriter Writer; +#ifdef FMT_HAS_WCHAR_T typedef BasicWriter WWriter; +#endif template class ArgFormatter; @@ -661,7 +670,9 @@ class BasicStringRef { }; typedef BasicStringRef StringRef; +#ifdef FMT_HAS_WCHAR_T typedef BasicStringRef WStringRef; +#endif /** \rst @@ -712,7 +723,9 @@ class BasicCStringRef { }; typedef BasicCStringRef CStringRef; +#ifdef FMT_HAS_WCHAR_T typedef BasicCStringRef WCStringRef; +#endif /** A formatting error such as invalid format string. */ class FMT_API FormatError : public std::runtime_error { @@ -977,6 +990,7 @@ extern template int CharTraits::format_float const char* format, unsigned width, int precision, long double value); #endif +#ifdef FMT_HAS_WCHAR_T template <> class CharTraits : public BasicCharTraits { public: @@ -996,6 +1010,7 @@ extern template int CharTraits::format_float (wchar_t *buffer, std::size_t size, const wchar_t* format, unsigned width, int precision, long double value); #endif +#endif // Checks if a number is negative - used to avoid warnings. template @@ -1219,7 +1234,9 @@ struct Value { StringValue string; StringValue sstring; StringValue ustring; +#ifdef FMT_HAS_WCHAR_T StringValue wstring; +#endif CustomValue custom; }; @@ -1255,11 +1272,13 @@ struct WCharHelper { typedef T Unsupported; }; +#ifdef FMT_HAS_WCHAR_T template struct WCharHelper { typedef T Supported; typedef Null Unsupported; }; +#endif typedef char Yes[1]; typedef char No[2]; @@ -1392,6 +1411,7 @@ class MakeValue : public Arg { template MakeValue(T *value); +#ifdef FMT_HAS_WCHAR_T // The following methods are private to disallow formatting of wide // characters and strings into narrow strings as in // fmt::format("{}", L"test"); @@ -1409,16 +1429,19 @@ class MakeValue : public Arg { MakeValue(typename WCharHelper::Unsupported); #endif MakeValue(typename WCharHelper::Unsupported); +#endif void set_string(StringRef str) { string.value = str.data(); string.size = str.size(); } +#ifdef FMT_HAS_WCHAR_T void set_string(WStringRef str) { wstring.value = str.data(); wstring.size = str.size(); } +#endif // Formats an argument of a custom type, such as a user-defined class. template @@ -1491,12 +1514,14 @@ class MakeValue : public Arg { static uint64_t type(T) { return Arg::INT; } #endif +#ifdef HAS_WCHAR_T #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) MakeValue(typename WCharHelper::Supported value) { int_value = value; } static uint64_t type(wchar_t) { return Arg::CHAR; } #endif +#endif #define FMT_MAKE_STR_VALUE(Type, TYPE) \ MakeValue(Type value) { set_string(value); } \ @@ -1523,17 +1548,18 @@ class MakeValue : public Arg { set_string(value); \ } \ static uint64_t type(Type) { return Arg::TYPE; } - +#ifdef FMT_HAS_WCHAR_T FMT_MAKE_WSTR_VALUE(wchar_t *, WSTRING) FMT_MAKE_WSTR_VALUE(const wchar_t *, WSTRING) FMT_MAKE_WSTR_VALUE(const std::wstring &, WSTRING) -#if FMT_HAS_STRING_VIEW +#ifdef FMT_HAS_STRING_VIEW FMT_MAKE_WSTR_VALUE(const std::wstring_view &, WSTRING) #endif #if FMT_HAS_EXPERIMENTAL_STRING_VIEW FMT_MAKE_WSTR_VALUE(const std::experimental::wstring_view &, WSTRING) #endif FMT_MAKE_WSTR_VALUE(WStringRef, WSTRING) +#endif FMT_MAKE_VALUE(void *, pointer, POINTER) FMT_MAKE_VALUE(const void *, pointer, POINTER) @@ -1776,10 +1802,12 @@ class ArgVisitor { return FMT_DISPATCH(visit_unhandled_arg()); } +#ifdef FMT_HAS_WCHAR_T /** Visits a wide string argument. **/ Result visit_wstring(Arg::StringValue) { return FMT_DISPATCH(visit_unhandled_arg()); } +#endif /** Visits a pointer argument. **/ Result visit_pointer(const void *) { @@ -1825,8 +1853,10 @@ class ArgVisitor { return FMT_DISPATCH(visit_cstring(arg.string.value)); case Arg::STRING: return FMT_DISPATCH(visit_string(arg.string)); +#ifdef FMT_HAS_WCHAR_T case Arg::WSTRING: return FMT_DISPATCH(visit_wstring(arg.wstring)); +#endif case Arg::POINTER: return FMT_DISPATCH(visit_pointer(arg.pointer)); case Arg::CUSTOM: @@ -2055,10 +2085,12 @@ inline StrFormatSpec pad( return StrFormatSpec(str, width, fill); } +#ifdef FMT_HAS_WCHAR_T inline StrFormatSpec pad( const wchar_t *str, unsigned width, char fill = ' ') { return StrFormatSpec(str, width, fill); } +#endif namespace internal { @@ -2224,11 +2256,13 @@ class ArgFormatterBase : public ArgVisitor { writer_.write_str(value, spec_); } +#ifdef FMT_HAS_WCHAR_T using ArgVisitor::visit_wstring; void visit_wstring(internal::Arg::StringValue value) { writer_.write_str(value, spec_); } +#endif void visit_pointer(const void *value) { if (spec_.type_ && spec_.type_ != 'p') @@ -3517,11 +3551,13 @@ inline std::string format(CStringRef format_str, ArgList args) { return w.str(); } +#ifdef FMT_HAS_WCHAR_T inline std::wstring format(WCStringRef format_str, ArgList args) { WMemoryWriter w; w.write(format_str, args); return w.str(); } +#endif /** \rst @@ -3665,17 +3701,21 @@ inline internal::NamedArgWithType arg(StringRef name, const T &arg) { return internal::NamedArgWithType(name, arg); } +#ifdef FMT_HAS_WCHAR_T template inline internal::NamedArgWithType arg(WStringRef name, const T &arg) { return internal::NamedArgWithType(name, arg); } +#endif // The following two functions are deleted intentionally to disable // nested named arguments as in ``format("{}", arg("a", arg("b", 42)))``. template void arg(StringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; +#ifdef FMT_HAS_WCHAR_T template void arg(WStringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; +#endif } #if FMT_GCC_VERSION @@ -3812,7 +3852,9 @@ void arg(WStringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; namespace fmt { FMT_VARIADIC(std::string, format, CStringRef) +#ifdef FMT_HAS_WCHAR_T FMT_VARIADIC_W(std::wstring, format, WCStringRef) +#endif FMT_VARIADIC(void, print, CStringRef) FMT_VARIADIC(void, print, std::FILE *, CStringRef) FMT_VARIADIC(void, print_colored, Color, CStringRef) @@ -4118,10 +4160,12 @@ ArgJoin join(It first, It last, const BasicCStringRef& sep) { return ArgJoin(first, last, sep); } +#ifdef FMT_HAS_WCHAR_T template ArgJoin join(It first, It last, const BasicCStringRef& sep) { return ArgJoin(first, last, sep); } +#endif #if FMT_HAS_GXX_CXX11 && \ (!FMT_GCC_VERSION || FMT_GCC_VERSION >= 405 || __clang__) @@ -4131,12 +4175,14 @@ auto join(const Range& range, const BasicCStringRef& sep) return join(std::begin(range), std::end(range), sep); } +#ifdef FMT_HAS_WCHAR_T template auto join(const Range& range, const BasicCStringRef& sep) -> ArgJoin { return join(std::begin(range), std::end(range), sep); } #endif +#endif template void format_arg(fmt::BasicFormatter &f, @@ -4208,8 +4254,10 @@ inline namespace literals { */ inline internal::UdlFormat operator"" _format(const char *s, std::size_t) { return {s}; } +#ifdef FMT_HAS_WCHAR_T inline internal::UdlFormat operator"" _format(const wchar_t *s, std::size_t) { return {s}; } +#endif /** \rst @@ -4223,8 +4271,10 @@ operator"" _format(const wchar_t *s, std::size_t) { return {s}; } */ inline internal::UdlArg operator"" _a(const char *s, std::size_t) { return {s}; } +#ifdef FMT_HAS_WCHAR_T inline internal::UdlArg operator"" _a(const wchar_t *s, std::size_t) { return {s}; } +#endif } // inline namespace literals } // namespace fmt diff --git a/fmt/printf.cc b/fmt/printf.cc index 95d7a36a..d6a68684 100644 --- a/fmt/printf.cc +++ b/fmt/printf.cc @@ -25,7 +25,9 @@ FMT_FUNC int fprintf(std::FILE *f, CStringRef format, ArgList args) { #ifndef FMT_HEADER_ONLY template void PrintfFormatter::format(CStringRef format); +#ifdef FMT_HAS_WCHAR_T template void PrintfFormatter::format(WCStringRef format); +#endif #endif // FMT_HEADER_ONLY diff --git a/fmt/printf.h b/fmt/printf.h index 736d9d39..196a6ebb 100644 --- a/fmt/printf.h +++ b/fmt/printf.h @@ -524,10 +524,12 @@ inline void printf(Writer &w, CStringRef format, ArgList args) { } FMT_VARIADIC(void, printf, Writer &, CStringRef) +#ifdef FMT_HAS_WCHAR_T inline void printf(WWriter &w, WCStringRef format, ArgList args) { PrintfFormatter(args, w).format(format); } FMT_VARIADIC(void, printf, WWriter &, WCStringRef) +#endif /** \rst