@@ -47,18 +47,22 @@ make_u32(std::uint8_t b4, std::uint8_t b3, std::uint8_t b2, std::uint8_t b1)
47
47
48
48
template <endian::order = endian::order::little>
49
49
constexpr
50
- std:: uint32_t
51
- utf8_case5_special_number ( )
50
+ bool
51
+ utf8_case5 (std:: uint32_t v )
52
52
{
53
- return make_u32 (0x00 ,0x00 ,0x30 ,0xFF );
53
+ return ( ( ( v & make_u32 (0xC0 ,0xC0 ,0xF0 ,0x00 ) )
54
+ + make_u32 (0x7F ,0x7F ,0x70 ,0x00 ) ) | make_u32 (0x00 ,0x00 ,0x30 ,0x00 ) )
55
+ == make_u32 (0x00 ,0x00 ,0x30 ,0x00 );
54
56
}
55
57
56
58
template <>
57
59
constexpr
58
- std:: uint32_t
59
- utf8_case5_special_number <endian::order::big>()
60
+ bool
61
+ utf8_case5 <endian::order::big>(std:: uint32_t v )
60
62
{
61
- return make_u32 (0xFF ,0xFF ,0x30 ,0x00 );
63
+ return ( ( ( v & make_u32 (0xC0 ,0xC0 ,0xF0 ,0x00 ) )
64
+ + make_u32 (0x00 ,0x00 ,0x70 ,0xFF ) ) | make_u32 (0x00 ,0x00 ,0x30 ,0x00 ) )
65
+ == make_u32 (0x80 ,0x80 ,0x30 ,0x00 );
62
66
}
63
67
64
68
template <int N>
@@ -143,10 +147,7 @@ is_valid_utf8(const char* p, uint16_t first)
143
147
// 4 bytes, second byte [90, BF]
144
148
case 5 :
145
149
std::memcpy (&v, p, 4 );
146
- return ( ( ( v & make_u32 (0xC0 ,0xC0 ,0xF0 ,0x00 ) )
147
- + make_u32 (0x7F ,0x7F ,0x70 ,0xFF ) )
148
- | make_u32 (0x00 ,0x00 ,0x30 ,0x00 ) )
149
- == utf8_case5_special_number<endian::order::native>();
150
+ return utf8_case5<endian::order::native>(v);
150
151
151
152
// 4 bytes, second byte [80, BF]
152
153
case 6 :
0 commit comments