7#include "unicode_general_category.hpp"
8#include "unicode_bidi_class.hpp"
9#include "unicode_bidi_bracket_type.hpp"
10#include "unicode_grapheme_cluster_break.hpp"
11#include "../required.hpp"
15constexpr char32_t unicode_hangul_S_base = U
'\uac00';
16constexpr char32_t unicode_hangul_L_base = U
'\u1100';
17constexpr char32_t unicode_hangul_V_base = U
'\u1161';
18constexpr char32_t unicode_hangul_T_base = U
'\u11a7';
19constexpr char32_t unicode_hangul_L_count = 19;
20constexpr char32_t unicode_hangul_V_count = 21;
21constexpr char32_t unicode_hangul_T_count = 28;
22constexpr char32_t unicode_hangul_N_count = unicode_hangul_V_count * unicode_hangul_T_count;
23constexpr char32_t unicode_hangul_S_count = unicode_hangul_L_count * unicode_hangul_N_count;
26[[nodiscard]]
constexpr bool is_hangul_L_part(
char32_t code_point)
noexcept
28 return code_point >= detail::unicode_hangul_L_base && code_point < (detail::unicode_hangul_L_base + detail::unicode_hangul_L_count);
31[[nodiscard]]
constexpr bool is_hangul_V_part(
char32_t code_point)
noexcept
33 return code_point >= detail::unicode_hangul_V_base && code_point < (detail::unicode_hangul_V_base + detail::unicode_hangul_V_count);
36[[nodiscard]]
constexpr bool is_hangul_T_part(
char32_t code_point)
noexcept
38 return code_point >= detail::unicode_hangul_T_base && code_point < (detail::unicode_hangul_T_base + detail::unicode_hangul_T_count);
41[[nodiscard]]
constexpr bool is_hangul_syllable(
char32_t code_point)
noexcept
43 return code_point >= detail::unicode_hangul_S_base && code_point < (detail::unicode_hangul_S_base + detail::unicode_hangul_S_count);
46[[nodiscard]]
constexpr bool is_hangul_LV_part(
char32_t code_point)
noexcept
48 return is_hangul_syllable(code_point) && ((code_point - detail::unicode_hangul_S_base) % detail::unicode_hangul_T_count) == 0;
51[[nodiscard]]
constexpr bool is_hangul_LVT_part(
char32_t code_point)
noexcept
53 return is_hangul_syllable(code_point) && ((code_point - detail::unicode_hangul_S_base) % detail::unicode_hangul_T_count) != 0;
78 _bidi_class(
static_cast<uint32_t
>(
bidi_class)),
90 tt_axiom(
static_cast<uint32_t
>(
bidi_class) <= 0x1f);
103 return static_cast<char32_t>(_general_info >> 10);
114 return static_cast<unicode_grapheme_cluster_break
>((_general_info >> 1) & 0xf);
125 return static_cast<unicode_general_category
>((_general_info >> 5) & 0x1f);
134 [[nodiscard]]
constexpr unicode_bidi_class
bidi_class() const noexcept
136 return static_cast<unicode_bidi_class
>(_bidi_class);
147 return static_cast<unicode_bidi_bracket_type
>(_bidi_bracket_type);
155 return static_cast<char32_t>(_bidi_mirrored_glyph);
163 return static_cast<bool>(_decomposition_canonical);
171 return static_cast<bool>(_composition_canonical);
185 return static_cast<uint8_t
>(_combining_class);
201 return static_cast<size_t>(_decomposition_length);
217 return static_cast<size_t>(_decomposition_index);
228 if (_decomposition_canonical && _decomposition_length == 1) {
229 return static_cast<char32_t>(_decomposition_index);
242 uint32_t _general_info;
245 uint32_t _bidi_class:5;
246 uint32_t _bidi_bracket_type:2;
247 uint32_t _bidi_mirrored_glyph : 21;
248 uint32_t _bidi_reserved : 4 = 0;
251 uint32_t _decomposition_canonical : 1;
252 uint32_t _composition_canonical : 1;
253 uint32_t _combining_class : 8;
254 uint32_t _decomposition_index : 21;
255 uint32_t _decomposition_reserved1 : 1 = 0;
258 uint32_t _decomposition_length : 5;
259 uint32_t _decomposition_reserved2 : 27 = 0;
262 template<
typename It>
266static_assert(
sizeof(unicode_description) == 16);
275[[nodiscard]]
constexpr It unicode_description_find(It first, It last,
char32_t code_point)
noexcept
277 tt_axiom(code_point <= 0x10'ffff);
278 uint32_t general_info =
static_cast<uint32_t
>(code_point) << 10;
280 auto it =
std::lower_bound(first, last, general_info, [](
auto const &item,
auto const &value) {
281 return item._general_info < value;
284 if (it == last || it->code_point() != code_point) {
303[[nodiscard]]
unicode_description const &unicode_description_find(
char32_t code_point)
noexcept;
Description of a unicode code point.
Definition unicode_description.hpp:62
friend constexpr It unicode_description_find(It first, It last, char32_t code_point) noexcept
Find a code-point in a unicode_description table using a binary-search algorithm.
Definition unicode_description.hpp:275
constexpr unicode_bidi_class bidi_class() const noexcept
The bidi class of this code-point This function is used by the bidirectional algorithm to figure out ...
Definition unicode_description.hpp:134
constexpr uint8_t combining_class() const noexcept
Get the combining class.
Definition unicode_description.hpp:183
constexpr size_t decomposition_length() const noexcept
The number of code-points the decomposed grapheme has.
Definition unicode_description.hpp:199
constexpr bool composition_canonical() const noexcept
This character has a canonical composition.
Definition unicode_description.hpp:169
constexpr bool decomposition_canonical() const noexcept
This character has a canonical decomposition.
Definition unicode_description.hpp:161
constexpr unicode_bidi_bracket_type bidi_bracket_type() const noexcept
Get the bidi bracket type.
Definition unicode_description.hpp:145
constexpr unicode_grapheme_cluster_break grapheme_cluster_break() const noexcept
The grapheme cluster break of this code-point.
Definition unicode_description.hpp:112
constexpr size_t decomposition_index() const noexcept
A multi-use value representing the decomposition of this code-point.
Definition unicode_description.hpp:215
constexpr char32_t code_point() const noexcept
The code point of the description.
Definition unicode_description.hpp:101
constexpr char32_t bidi_mirrored_glyph() const noexcept
Get the mirrored glyph.
Definition unicode_description.hpp:153
constexpr unicode_general_category general_category() const noexcept
The general category of this code-point.
Definition unicode_description.hpp:123
constexpr char32_t canonical_equivalent() const noexcept
Get the canonical equivalent of this code-point.
Definition unicode_description.hpp:226