1#![no_std]
24
25use icu_normalizer::uts46::Uts46MapperBorrowed;
26use icu_properties::props::GeneralCategory;
27use icu_properties::CodePointMapDataBorrowed;
28
29const fn joining_type_to_mask(jt: icu_properties::props::JoiningType) -> u32 {
31 1u32 << jt.to_icu4c_value()
32}
33
34pub const LEFT_OR_DUAL_JOINING_MASK: JoiningTypeMask = JoiningTypeMask(
36 joining_type_to_mask(icu_properties::props::JoiningType::LeftJoining)
37 | joining_type_to_mask(icu_properties::props::JoiningType::DualJoining),
38);
39
40pub const RIGHT_OR_DUAL_JOINING_MASK: JoiningTypeMask = JoiningTypeMask(
42 joining_type_to_mask(icu_properties::props::JoiningType::RightJoining)
43 | joining_type_to_mask(icu_properties::props::JoiningType::DualJoining),
44);
45
46const fn bidi_class_to_mask(bc: icu_properties::props::BidiClass) -> u32 {
48 1u32 << bc.to_icu4c_value()
49}
50
51pub const RTL_MASK: BidiClassMask = BidiClassMask(
53 bidi_class_to_mask(icu_properties::props::BidiClass::RightToLeft)
54 | bidi_class_to_mask(icu_properties::props::BidiClass::ArabicLetter)
55 | bidi_class_to_mask(icu_properties::props::BidiClass::ArabicNumber),
56);
57
58pub const FIRST_BC_MASK: BidiClassMask = BidiClassMask(
61 bidi_class_to_mask(icu_properties::props::BidiClass::LeftToRight)
62 | bidi_class_to_mask(icu_properties::props::BidiClass::RightToLeft)
63 | bidi_class_to_mask(icu_properties::props::BidiClass::ArabicLetter),
64);
65
66pub const LAST_LTR_MASK: BidiClassMask = BidiClassMask(
69 bidi_class_to_mask(icu_properties::props::BidiClass::LeftToRight)
70 | bidi_class_to_mask(icu_properties::props::BidiClass::EuropeanNumber),
71);
72
73pub const LAST_RTL_MASK: BidiClassMask = BidiClassMask(
76 bidi_class_to_mask(icu_properties::props::BidiClass::RightToLeft)
77 | bidi_class_to_mask(icu_properties::props::BidiClass::ArabicLetter)
78 | bidi_class_to_mask(icu_properties::props::BidiClass::EuropeanNumber)
79 | bidi_class_to_mask(icu_properties::props::BidiClass::ArabicNumber),
80);
81
82pub const MIDDLE_LTR_MASK: BidiClassMask = BidiClassMask(
84 bidi_class_to_mask(icu_properties::props::BidiClass::LeftToRight)
85 | bidi_class_to_mask(icu_properties::props::BidiClass::EuropeanNumber)
86 | bidi_class_to_mask(icu_properties::props::BidiClass::EuropeanSeparator)
87 | bidi_class_to_mask(icu_properties::props::BidiClass::CommonSeparator)
88 | bidi_class_to_mask(icu_properties::props::BidiClass::EuropeanTerminator)
89 | bidi_class_to_mask(icu_properties::props::BidiClass::OtherNeutral)
90 | bidi_class_to_mask(icu_properties::props::BidiClass::BoundaryNeutral)
91 | bidi_class_to_mask(icu_properties::props::BidiClass::NonspacingMark),
92);
93
94pub const MIDDLE_RTL_MASK: BidiClassMask = BidiClassMask(
96 bidi_class_to_mask(icu_properties::props::BidiClass::RightToLeft)
97 | bidi_class_to_mask(icu_properties::props::BidiClass::ArabicLetter)
98 | bidi_class_to_mask(icu_properties::props::BidiClass::ArabicNumber)
99 | bidi_class_to_mask(icu_properties::props::BidiClass::EuropeanNumber)
100 | bidi_class_to_mask(icu_properties::props::BidiClass::EuropeanSeparator)
101 | bidi_class_to_mask(icu_properties::props::BidiClass::CommonSeparator)
102 | bidi_class_to_mask(icu_properties::props::BidiClass::EuropeanTerminator)
103 | bidi_class_to_mask(icu_properties::props::BidiClass::OtherNeutral)
104 | bidi_class_to_mask(icu_properties::props::BidiClass::BoundaryNeutral)
105 | bidi_class_to_mask(icu_properties::props::BidiClass::NonspacingMark),
106);
107
108const fn general_category_to_mask(gc: GeneralCategory) -> u32 {
110 1 << (gc as u32)
111}
112
113const MARK_MASK: u32 = general_category_to_mask(GeneralCategory::NonspacingMark)
115 | general_category_to_mask(GeneralCategory::SpacingMark)
116 | general_category_to_mask(GeneralCategory::EnclosingMark);
117
118#[repr(transparent)]
120#[derive(#[automatically_derived]
impl ::core::clone::Clone for JoiningType {
#[inline]
fn clone(&self) -> JoiningType {
let _:
::core::clone::AssertParamIsClone<icu_properties::props::JoiningType>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for JoiningType { }Copy)]
121pub struct JoiningType(icu_properties::props::JoiningType);
122
123impl JoiningType {
124 #[inline(always)]
126 pub fn to_mask(self) -> JoiningTypeMask {
127 JoiningTypeMask(joining_type_to_mask(self.0))
128 }
129
130 #[inline(always)]
132 pub fn is_transparent(self) -> bool {
133 self.0 == icu_properties::props::JoiningType::Transparent
134 }
135}
136
137#[repr(transparent)]
140#[derive(#[automatically_derived]
impl ::core::clone::Clone for JoiningTypeMask {
#[inline]
fn clone(&self) -> JoiningTypeMask {
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for JoiningTypeMask { }Copy)]
141pub struct JoiningTypeMask(u32);
142
143impl JoiningTypeMask {
144 #[inline(always)]
146 pub fn intersects(self, other: JoiningTypeMask) -> bool {
147 self.0 & other.0 != 0
148 }
149}
150
151#[repr(transparent)]
153#[derive(#[automatically_derived]
impl ::core::clone::Clone for BidiClass {
#[inline]
fn clone(&self) -> BidiClass {
let _:
::core::clone::AssertParamIsClone<icu_properties::props::BidiClass>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BidiClass { }Copy)]
154pub struct BidiClass(icu_properties::props::BidiClass);
155
156impl BidiClass {
157 #[inline(always)]
159 pub fn to_mask(self) -> BidiClassMask {
160 BidiClassMask(bidi_class_to_mask(self.0))
161 }
162
163 #[inline(always)]
165 pub fn is_ltr(self) -> bool {
166 self.0 == icu_properties::props::BidiClass::LeftToRight
167 }
168
169 #[inline(always)]
171 pub fn is_nonspacing_mark(self) -> bool {
172 self.0 == icu_properties::props::BidiClass::NonspacingMark
173 }
174
175 #[inline(always)]
177 pub fn is_european_number(self) -> bool {
178 self.0 == icu_properties::props::BidiClass::EuropeanNumber
179 }
180
181 #[inline(always)]
183 pub fn is_arabic_number(self) -> bool {
184 self.0 == icu_properties::props::BidiClass::ArabicNumber
185 }
186}
187
188#[repr(transparent)]
191#[derive(#[automatically_derived]
impl ::core::clone::Clone for BidiClassMask {
#[inline]
fn clone(&self) -> BidiClassMask {
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BidiClassMask { }Copy)]
192pub struct BidiClassMask(u32);
193
194impl BidiClassMask {
195 #[inline(always)]
197 pub fn intersects(self, other: BidiClassMask) -> bool {
198 self.0 & other.0 != 0
199 }
200}
201
202pub struct Adapter {
204 mapper: Uts46MapperBorrowed<'static>,
205 general_category: CodePointMapDataBorrowed<'static, GeneralCategory>,
206 bidi_class: CodePointMapDataBorrowed<'static, icu_properties::props::BidiClass>,
207 joining_type: CodePointMapDataBorrowed<'static, icu_properties::props::JoiningType>,
208}
209
210#[cfg(feature = "compiled_data")]
211impl Default for Adapter {
212 fn default() -> Self {
213 Self::new()
214 }
215}
216
217impl Adapter {
218 #[cfg(feature = "compiled_data")]
220 #[inline(always)]
221 pub const fn new() -> Self {
222 Self {
223 mapper: Uts46MapperBorrowed::new(),
224 general_category: icu_properties::CodePointMapData::<GeneralCategory>::new(),
225 bidi_class: icu_properties::CodePointMapData::<icu_properties::props::BidiClass>::new(),
226 joining_type:
227 icu_properties::CodePointMapData::<icu_properties::props::JoiningType>::new(),
228 }
229 }
230
231 #[inline(always)]
233 pub fn is_virama(&self, c: char) -> bool {
234 self.mapper.is_virama(c)
235 }
236
237 #[inline(always)]
240 pub fn is_mark(&self, c: char) -> bool {
241 (general_category_to_mask(self.general_category.get(c)) & MARK_MASK) != 0
242 }
243
244 #[inline(always)]
246 pub fn bidi_class(&self, c: char) -> BidiClass {
247 BidiClass(self.bidi_class.get(c))
248 }
249
250 #[inline(always)]
252 pub fn joining_type(&self, c: char) -> JoiningType {
253 JoiningType(self.joining_type.get(c))
254 }
255
256 #[inline(always)]
261 pub fn map_normalize<'delegate, I: Iterator<Item = char> + 'delegate>(
262 &'delegate self,
263 iter: I,
264 ) -> impl Iterator<Item = char> + 'delegate {
265 self.mapper.map_normalize(iter)
266 }
267
268 #[inline(always)]
273 pub fn normalize_validate<'delegate, I: Iterator<Item = char> + 'delegate>(
274 &'delegate self,
275 iter: I,
276 ) -> impl Iterator<Item = char> + 'delegate {
277 self.mapper.normalize_validate(iter)
278 }
279}