1use crate::{props::EnumeratedProperty, provider::PropertyEnumBidiMirroringGlyphV1};
6use icu_collections::codepointtrie::TrieValue;
7use zerovec::ule::{AsULE, RawBytesULE};
8
9#[derive(Debug, Eq, PartialEq, Clone, Copy, Default)]
12#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
13#[cfg_attr(feature = "datagen", databake(path = icu_properties::props))]
14#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
15#[allow(clippy::exhaustive_structs)] pub struct BidiMirroringGlyph {
17 pub mirroring_glyph: Option<char>,
19 pub mirrored: bool,
21 pub paired_bracket_type: BidiPairedBracketType,
23}
24
25impl EnumeratedProperty for BidiMirroringGlyph {
26 type DataMarker = PropertyEnumBidiMirroringGlyphV1;
27 #[cfg(feature = "compiled_data")]
28 const SINGLETON: &'static crate::provider::PropertyCodePointMap<'static, Self> =
29 crate::provider::Baked::SINGLETON_PROPERTY_ENUM_BIDI_MIRRORING_GLYPH_V1;
30 const NAME: &'static [u8] = b"Bidi_Mirroring_Glyph";
31 const SHORT_NAME: &'static [u8] = b"Bidi_Mirroring_Glyph";
32}
33
34impl crate::private::Sealed for BidiMirroringGlyph {}
35
36impl AsULE for BidiMirroringGlyph {
37 type ULE = zerovec::ule::RawBytesULE<3>;
38
39 fn to_unaligned(self) -> Self::ULE {
40 let [a, b, c, _] = TrieValue::to_u32(self).to_le_bytes();
41 RawBytesULE([a, b, c])
42 }
43 fn from_unaligned(unaligned: Self::ULE) -> Self {
44 let [a, b, c] = unaligned.0;
45 TrieValue::try_from_u32(u32::from_le_bytes([a, b, c, 0])).unwrap_or_default()
46 }
47}
48
49#[derive(Debug, Eq, PartialEq, Copy, Clone, Default)]
57#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
58#[cfg_attr(feature = "datagen", databake(path = icu_properties::props))]
59#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
60#[non_exhaustive]
61pub enum BidiPairedBracketType {
62 Open,
64 Close,
66 #[default]
68 None,
69}
70
71#[cfg(feature = "unicode_bidi")]
120impl unicode_bidi::data_source::BidiDataSource
121 for crate::CodePointMapDataBorrowed<'_, crate::props::BidiClass>
122{
123 fn bidi_class(&self, c: char) -> unicode_bidi::BidiClass {
124 use crate::props::BidiClass;
125 match self.get(c) {
126 BidiClass::LeftToRight => unicode_bidi::BidiClass::L,
127 BidiClass::RightToLeft => unicode_bidi::BidiClass::R,
128 BidiClass::EuropeanNumber => unicode_bidi::BidiClass::EN,
129 BidiClass::EuropeanSeparator => unicode_bidi::BidiClass::ES,
130 BidiClass::EuropeanTerminator => unicode_bidi::BidiClass::ET,
131 BidiClass::ArabicNumber => unicode_bidi::BidiClass::AN,
132 BidiClass::CommonSeparator => unicode_bidi::BidiClass::CS,
133 BidiClass::ParagraphSeparator => unicode_bidi::BidiClass::B,
134 BidiClass::SegmentSeparator => unicode_bidi::BidiClass::S,
135 BidiClass::WhiteSpace => unicode_bidi::BidiClass::WS,
136 BidiClass::OtherNeutral => unicode_bidi::BidiClass::ON,
137 BidiClass::LeftToRightEmbedding => unicode_bidi::BidiClass::LRE,
138 BidiClass::LeftToRightOverride => unicode_bidi::BidiClass::LRO,
139 BidiClass::ArabicLetter => unicode_bidi::BidiClass::AL,
140 BidiClass::RightToLeftEmbedding => unicode_bidi::BidiClass::RLE,
141 BidiClass::RightToLeftOverride => unicode_bidi::BidiClass::RLO,
142 BidiClass::PopDirectionalFormat => unicode_bidi::BidiClass::PDF,
143 BidiClass::NonspacingMark => unicode_bidi::BidiClass::NSM,
144 BidiClass::BoundaryNeutral => unicode_bidi::BidiClass::BN,
145 BidiClass::FirstStrongIsolate => unicode_bidi::BidiClass::FSI,
146 BidiClass::LeftToRightIsolate => unicode_bidi::BidiClass::LRI,
147 BidiClass::RightToLeftIsolate => unicode_bidi::BidiClass::RLI,
148 BidiClass::PopDirectionalIsolate => unicode_bidi::BidiClass::PDI,
149 _ => unicode_bidi::BidiClass::ON,
151 }
152 }
153}