Skip to content

Commit 0335312

Browse files
committed
Demacrify UTF-8 check
1 parent 463fe65 commit 0335312

File tree

7 files changed

+19
-19
lines changed

7 files changed

+19
-19
lines changed

include/fmt/base.h

+12-12
Original file line numberDiff line numberDiff line change
@@ -429,21 +429,20 @@ struct is_std_string_like<T, void_t<decltype(std::declval<T>().find_first_of(
429429
: std::is_convertible<decltype(std::declval<T>().data()),
430430
const typename T::value_type*> {};
431431

432-
// Returns true iff the literal encoding is UTF-8.
433-
constexpr auto is_utf8_enabled() -> bool { return "\u00A7"[1] == '\xA7'; }
434-
// It is a macro for better debug codegen without if constexpr.
435-
#define FMT_USE_UTF8 (!FMT_MSC_VERSION || fmt::detail::is_utf8_enabled())
436-
437-
template <typename T> constexpr const char* narrow(const T*) { return nullptr; }
438-
constexpr FMT_ALWAYS_INLINE const char* narrow(const char* s) { return s; }
432+
// Check if the literal encoding is UTF-8.
433+
enum { is_utf8_enabled = "\u00A7"[1] == '\xA7' };
434+
enum { use_utf8 = !FMT_MSC_VERSION || is_utf8_enabled };
439435

440436
#ifndef FMT_UNICODE
441437
# define FMT_UNICODE 1
442438
#endif
443439

444-
static_assert(!FMT_UNICODE || FMT_USE_UTF8,
440+
static_assert(!FMT_UNICODE || use_utf8,
445441
"Unicode support requires compiling with /utf-8");
446442

443+
template <typename T> constexpr const char* narrow(const T*) { return nullptr; }
444+
constexpr FMT_ALWAYS_INLINE const char* narrow(const char* s) { return s; }
445+
447446
template <typename Char>
448447
FMT_CONSTEXPR auto compare(const Char* s1, const Char* s2, std::size_t n)
449448
-> int {
@@ -2931,7 +2930,8 @@ FMT_API void vprint_buffered(FILE* f, string_view fmt, format_args args);
29312930
template <typename... T>
29322931
FMT_INLINE void print(format_string<T...> fmt, T&&... args) {
29332932
vargs<T...> va = {{args...}};
2934-
if (!FMT_USE_UTF8) return detail::vprint_mojibake(stdout, fmt.str, va, false);
2933+
if (!detail::use_utf8)
2934+
return detail::vprint_mojibake(stdout, fmt.str, va, false);
29352935
return detail::is_locking<T...>() ? vprint_buffered(stdout, fmt.str, va)
29362936
: vprint(fmt.str, va);
29372937
}
@@ -2947,7 +2947,7 @@ FMT_INLINE void print(format_string<T...> fmt, T&&... args) {
29472947
template <typename... T>
29482948
FMT_INLINE void print(FILE* f, format_string<T...> fmt, T&&... args) {
29492949
vargs<T...> va = {{args...}};
2950-
if (!FMT_USE_UTF8) return detail::vprint_mojibake(f, fmt.str, va, false);
2950+
if (!detail::use_utf8) return detail::vprint_mojibake(f, fmt.str, va, false);
29512951
return detail::is_locking<T...>() ? vprint_buffered(f, fmt.str, va)
29522952
: vprint(f, fmt.str, va);
29532953
}
@@ -2957,8 +2957,8 @@ FMT_INLINE void print(FILE* f, format_string<T...> fmt, T&&... args) {
29572957
template <typename... T>
29582958
FMT_INLINE void println(FILE* f, format_string<T...> fmt, T&&... args) {
29592959
vargs<T...> va = {{args...}};
2960-
return FMT_USE_UTF8 ? vprintln(f, fmt.str, va)
2961-
: detail::vprint_mojibake(f, fmt.str, va, true);
2960+
return detail::use_utf8 ? vprintln(f, fmt.str, va)
2961+
: detail::vprint_mojibake(f, fmt.str, va, true);
29622962
}
29632963

29642964
/// Formats `args` according to specifications in `fmt` and writes the output

include/fmt/chrono.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ void write_codecvt(codecvt_result<CodeUnit>& out, string_view in,
353353
template <typename OutputIt>
354354
auto write_encoded_tm_str(OutputIt out, string_view in, const std::locale& loc)
355355
-> OutputIt {
356-
if (FMT_USE_UTF8 && loc != get_classic_locale()) {
356+
if (detail::use_utf8 && loc != get_classic_locale()) {
357357
// char16_t and char32_t codecvts are broken in MSVC (linkage errors) and
358358
// gcc-4.
359359
#if FMT_MSC_VERSION != 0 || \
@@ -648,7 +648,7 @@ FMT_CONSTEXPR inline auto get_units() -> const char* {
648648
if (std::is_same<Period, std::pico>::value) return "ps";
649649
if (std::is_same<Period, std::nano>::value) return "ns";
650650
if (std::is_same<Period, std::micro>::value)
651-
return FMT_USE_UTF8 ? "µs" : "us";
651+
return detail::use_utf8 ? "µs" : "us";
652652
if (std::is_same<Period, std::milli>::value) return "ms";
653653
if (std::is_same<Period, std::centi>::value) return "cs";
654654
if (std::is_same<Period, std::deci>::value) return "ds";

include/fmt/format.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1862,7 +1862,7 @@ auto find_escape(const Char* begin, const Char* end)
18621862

18631863
inline auto find_escape(const char* begin, const char* end)
18641864
-> find_escape_result<char> {
1865-
if (!FMT_USE_UTF8) return find_escape<char>(begin, end);
1865+
if (!detail::use_utf8) return find_escape<char>(begin, end);
18661866
auto result = find_escape_result<char>{end, nullptr, 0};
18671867
for_each_codepoint(string_view(begin, to_unsigned(end - begin)),
18681868
[&](uint32_t cp, string_view sv) {

include/fmt/ostream.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ inline void vprint(std::ostream& os, string_view fmt, format_args args) {
142142
FMT_EXPORT template <typename... T>
143143
void print(std::ostream& os, format_string<T...> fmt, T&&... args) {
144144
fmt::vargs<T...> vargs = {{args...}};
145-
if (FMT_USE_UTF8) return vprint(os, fmt.str, vargs);
145+
if (detail::use_utf8) return vprint(os, fmt.str, vargs);
146146
auto buffer = memory_buffer();
147147
detail::vformat_to(buffer, fmt.str, vargs);
148148
detail::write_buffer(os, buffer);

include/fmt/xchar.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ template <> struct is_char<char32_t> : std::true_type {};
118118

119119
#ifdef __cpp_char8_t
120120
template <>
121-
struct is_char<char8_t> : bool_constant<detail::is_utf8_enabled()> {};
121+
struct is_char<char8_t> : bool_constant<detail::is_utf8_enabled> {};
122122
#endif
123123

124124
template <typename... T>

test/ranges-test.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ TEST(ranges_test, escape) {
560560
EXPECT_EQ(fmt::format("{}", vec{"\x7f"}), "[\"\\x7f\"]");
561561
EXPECT_EQ(fmt::format("{}", vec{"n\xcc\x83"}), "[\"n\xcc\x83\"]");
562562

563-
if (FMT_USE_UTF8) {
563+
if (fmt::detail::use_utf8) {
564564
EXPECT_EQ(fmt::format("{}", vec{"\xcd\xb8"}), "[\"\\u0378\"]");
565565
// Unassigned Unicode code points.
566566
EXPECT_EQ(fmt::format("{}", vec{"\xf0\xaa\x9b\x9e"}), "[\"\\U0002a6de\"]");

test/unicode-test.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
using testing::Contains;
1717

18-
TEST(unicode_test, use_utf8) { EXPECT_TRUE(FMT_USE_UTF8); }
18+
TEST(unicode_test, use_utf8) { EXPECT_TRUE(fmt::detail::use_utf8); }
1919

2020
TEST(unicode_test, legacy_locale) {
2121
auto loc = get_locale("be_BY.CP1251", "Belarusian_Belarus.1251");

0 commit comments

Comments
 (0)