blob: 5f8c6a4e09b2bfb42bba2e1e4231c42a16ad7c64 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#pragma once
namespace unicode {
// bits_to_compare: limit bits to consider even further than defined by T
// T: usually, char32_t, uint32_t etc.
template<size_t bits_to_compare = 32, typename T>
static inline bool is_valid_unicode(const T& value) noexcept
{
if constexpr(sizeof(T) == 1 || bits_to_compare <= 15)
return true;
else if constexpr(sizeof(T) == 2 || bits_to_compare <= 20)
//return value <= 0xD7FF || value >= 0xE000;
return (value & 0xF800) != 0xD800;
else
//return (value & 0xFFFFF800) != 0x0000D800 && (value >> 16) <= 0x10;
return value <= 0xD7FF || (value >= 0xE000 && value <= 0x10FFFF);
}
} // namespace unicode
|