22 typename iterator = Iterator;
24 typename it_base_type = std::remove_cv_t<it_value_type>;
27 typename value_type = char32_t;
38 [[nodiscard]]
constexpr value_type operator*()
const noexcept
40 if constexpr (std::is_same_v<it_base_type, char32_t>) {
42 }
else if constexpr (std::is_same_v<it_base_type, char16_t>) {
43 return detail::utf16_to_utf32(it);
44 }
else if constexpr (std::is_same_v<it_base_type, char8_t>) {
45 return detail::utf8_to_utf32(it);
53 if constexpr (std::is_same_v<it_base_type, char32_t>) {
56 }
else if constexpr (std::is_same_v<it_base_type, char16_t>) {
58 while (*(--it) & 0xfc00 == 0xdc00) {}
60 }
else if constexpr (std::is_same_v<it_base_type, char8_t>) {
62 while (*(--it) & 0xc0 == 0x80) {}
73 if constexpr (std::is_same_v<it_base_type, char32_t>) {
76 }
else if constexpr (std::is_same_v<it_base_type, char16_t>) {
78 while (*(++it) & 0xfc00 == 0xdc00) {}
80 }
else if constexpr (std::is_same_v<it_base_type, char8_t>) {
82 while (*(++it) & 0xc0 == 0x80) {}
105 [[nodiscard]]
constexpr friend bool
107 [[nodiscard]]
constexpr friend auto