Move display width table out of function

This commit is contained in:
Victor Zverovich 2026-09-04 08:44:26 -07:00
parent bc82c408a6
commit 2e6c5741d2

View File

@ -649,16 +649,16 @@ FMT_CONSTEXPR void for_each_codepoint(string_view s, F f) {
} while (buf_ptr < buf + num_chars_left); } while (buf_ptr < buf + num_chars_left);
} }
FMT_CONSTEXPR inline auto display_width_of(uint32_t cp) noexcept -> size_t { struct wide_cp_range {
if (cp < 0x1100) return 1; uint32_t first;
struct wide_cp_range { uint32_t last;
uint32_t first; };
uint32_t last;
}; // Code points with display width 2, i.e. those with the Unicode 16.0.0
// Code points with display width 2, i.e. those with the Unicode // East_Asian_Width property set to W(ide) or F(ullwidth)
// East_Asian_Width property set to W(ide) or F(ullwidth) // (https://www.unicode.org/reports/tr11/), sorted and merged.
// (https://www.unicode.org/reports/tr11/), sorted and merged. template <typename = void> struct wide_cp_data {
constexpr wide_cp_range wide_cp_ranges[] = { static constexpr wide_cp_range ranges[] = {
// Hangul Jamo // Hangul Jamo
{0x1100, 0x115f}, {0x1100, 0x115f},
// Miscellaneous Technical // Miscellaneous Technical
@ -811,13 +811,21 @@ FMT_CONSTEXPR inline auto display_width_of(uint32_t cp) noexcept -> size_t {
// CJK Unified Ideographs Extension G (plane 3) // CJK Unified Ideographs Extension G (plane 3)
{0x30000, 0x3fffd}, {0x30000, 0x3fffd},
}; };
};
#if FMT_CPLUSPLUS < 201703L
template <typename T> constexpr wide_cp_range wide_cp_data<T>::ranges[];
#endif
FMT_CONSTEXPR inline auto display_width_of(uint32_t cp) noexcept -> size_t {
if (cp < 0x1100) return 1;
size_t lo = 0; size_t lo = 0;
size_t hi = sizeof(wide_cp_ranges) / sizeof(wide_cp_range); size_t hi = sizeof(wide_cp_data<>::ranges) / sizeof(wide_cp_range);
while (lo < hi) { while (lo < hi) {
size_t mid = lo + (hi - lo) / 2; size_t mid = lo + (hi - lo) / 2;
if (cp < wide_cp_ranges[mid].first) if (cp < wide_cp_data<>::ranges[mid].first)
hi = mid; hi = mid;
else if (cp > wide_cp_ranges[mid].last) else if (cp > wide_cp_data<>::ranges[mid].last)
lo = mid + 1; lo = mid + 1;
else else
return 2; return 2;