HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
unicode_normalization.hpp
1// Copyright Take Vos 2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "unicode_decomposition_type.hpp"
8#include "../cast.hpp"
9#include "../algorithm.hpp"
10#include <cstdint>
11#include <string>
12#include <string_view>
13
14namespace hi::inline v1 {
15
16enum class unicode_normalization_mask {
17 decompose_canonical = 1 << to_underlying(unicode_decomposition_type::canonical),
18 decompose_font = 1 << to_underlying(unicode_decomposition_type::font),
19 decompose_no_break = 1 << to_underlying(unicode_decomposition_type::no_break),
20 decompose_arabic = 1 << to_underlying(unicode_decomposition_type::arabic),
21 decompose_circle = 1 << to_underlying(unicode_decomposition_type::circle),
22 decompose_math = 1 << to_underlying(unicode_decomposition_type::math),
23 decompose_asian = 1 << to_underlying(unicode_decomposition_type::asian),
24 decompose_compat = 1 << to_underlying(unicode_decomposition_type::compat),
25
28 decompose_hangul = 1 << 8,
29
32 compose_hangul = 1 << 9,
33
38 decompose_control = 1 << 10,
39
42 compose_CRLF = 1 << 11,
43
48 decompose_newline_to_PS = 1 << 12,
49
54 decompose_newline_to_LF = 1 << 13,
55
60 decompose_newline_to_CRLF = 1 << 14,
61
66 decompose_newline_to_SP = 1 << 15,
67
72 decompose_newline = decompose_newline_to_PS | decompose_newline_to_LF | decompose_newline_to_CRLF | decompose_newline_to_SP,
73
76 NFD = decompose_canonical | decompose_hangul | compose_hangul,
77
80 NFKD = NFD | decompose_font | decompose_no_break | decompose_arabic | decompose_circle | decompose_math | decompose_asian |
81 decompose_compat,
82};
83
84[[nodiscard]] constexpr unicode_normalization_mask decompose_newline_to(char32_t new_line_char) noexcept
85{
86 switch (new_line_char) {
87 case U'\n': return unicode_normalization_mask::decompose_newline_to_LF;
88 case U'\r': return unicode_normalization_mask::decompose_newline_to_CRLF;
89 case U'\u2029': return unicode_normalization_mask::decompose_newline_to_PS;
90 case U' ': return unicode_normalization_mask::decompose_newline_to_SP;
91 default: hi_no_default();
92 }
93}
94
95[[nodiscard]] constexpr bool any(unicode_normalization_mask const &rhs) noexcept
96{
97 return static_cast<bool>(to_underlying(rhs));
98}
99
100[[nodiscard]] constexpr unicode_normalization_mask
101operator|(unicode_normalization_mask const &lhs, unicode_normalization_mask const &rhs) noexcept
102{
103 return static_cast<unicode_normalization_mask>(to_underlying(lhs) | to_underlying(rhs));
104}
105
106[[nodiscard]] constexpr unicode_normalization_mask
107operator&(unicode_normalization_mask const &lhs, unicode_normalization_mask const &rhs) noexcept
108{
109 return static_cast<unicode_normalization_mask>(to_underlying(lhs) & to_underlying(rhs));
110}
111
112[[nodiscard]] constexpr unicode_normalization_mask
113operator&(unicode_normalization_mask const &lhs, unicode_decomposition_type const &rhs) noexcept
114{
115 return static_cast<unicode_normalization_mask>(to_underlying(lhs) & (1 << to_underlying(rhs)));
116}
117
126unicode_NFD(std::u32string_view text, unicode_normalization_mask normalization_mask = unicode_normalization_mask::NFD) noexcept;
127
135[[nodiscard]] std::u32string
136unicode_NFC(std::u32string_view text, unicode_normalization_mask normalization_mask = unicode_normalization_mask::NFD) noexcept;
137
145unicode_NFKD(std::u32string_view text, unicode_normalization_mask normalization_mask = unicode_normalization_mask::NFKD) noexcept;
146
154unicode_NFKC(std::u32string_view text, unicode_normalization_mask normalization_mask = unicode_normalization_mask::NFKD) noexcept;
155
156} // namespace hi::inline v1
constexpr alignment operator|(horizontal_alignment lhs, vertical_alignment rhs) noexcept
Combine vertical and horizontal alignment.
Definition alignment.hpp:200