icu_properties/
provider.rs

1// This file is part of ICU4X. For terms of use, please see the file
2// called LICENSE at the top level of the ICU4X source tree
3// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5// Provider structs must be stable
6#![allow(clippy::exhaustive_structs, clippy::exhaustive_enums)]
7
8//! 🚧 \[Unstable\] Data provider struct definitions for this ICU4X component.
9//!
10//! <div class="stab unstable">
11//! 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
12//! including in SemVer minor releases. While the serde representation of data structs is guaranteed
13//! to be stable, their Rust representation might not be. Use with caution.
14//! </div>
15//!
16//! Read more about data providers: [`icu_provider`]
17
18pub mod names;
19
20#[cfg(feature = "alloc")]
21pub use names::{
22    PropertyNameLongCanonicalCombiningClassV1, PropertyNameShortCanonicalCombiningClassV1,
23};
24
25pub use names::{
26    PropertyNameLongBidiClassV1, PropertyNameLongEastAsianWidthV1,
27    PropertyNameLongGeneralCategoryV1, PropertyNameLongGraphemeClusterBreakV1,
28    PropertyNameLongHangulSyllableTypeV1, PropertyNameLongIndicSyllabicCategoryV1,
29    PropertyNameLongJoiningTypeV1, PropertyNameLongLineBreakV1, PropertyNameLongScriptV1,
30    PropertyNameLongSentenceBreakV1, PropertyNameLongVerticalOrientationV1,
31    PropertyNameLongWordBreakV1, PropertyNameParseBidiClassV1,
32    PropertyNameParseCanonicalCombiningClassV1, PropertyNameParseEastAsianWidthV1,
33    PropertyNameParseGeneralCategoryMaskV1, PropertyNameParseGeneralCategoryV1,
34    PropertyNameParseGraphemeClusterBreakV1, PropertyNameParseHangulSyllableTypeV1,
35    PropertyNameParseIndicSyllabicCategoryV1, PropertyNameParseJoiningTypeV1,
36    PropertyNameParseLineBreakV1, PropertyNameParseScriptV1, PropertyNameParseSentenceBreakV1,
37    PropertyNameParseVerticalOrientationV1, PropertyNameParseWordBreakV1,
38    PropertyNameShortBidiClassV1, PropertyNameShortEastAsianWidthV1,
39    PropertyNameShortGeneralCategoryV1, PropertyNameShortGraphemeClusterBreakV1,
40    PropertyNameShortHangulSyllableTypeV1, PropertyNameShortIndicSyllabicCategoryV1,
41    PropertyNameShortJoiningTypeV1, PropertyNameShortLineBreakV1, PropertyNameShortScriptV1,
42    PropertyNameShortSentenceBreakV1, PropertyNameShortVerticalOrientationV1,
43    PropertyNameShortWordBreakV1,
44};
45
46pub use crate::props::gc::GeneralCategoryULE;
47use crate::props::*;
48use crate::script::ScriptWithExt;
49use core::ops::RangeInclusive;
50use icu_collections::codepointinvlist::CodePointInversionList;
51use icu_collections::codepointinvliststringlist::CodePointInversionListAndStringList;
52use icu_collections::codepointtrie::{CodePointMapRange, CodePointTrie, TrieValue};
53use icu_provider::prelude::*;
54use zerofrom::ZeroFrom;
55use zerovec::{VarZeroVec, ZeroSlice};
56
57#[cfg(feature = "compiled_data")]
58#[derive(Debug)]
59/// Baked data
60///
61/// <div class="stab unstable">
62/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
63/// including in SemVer minor releases. In particular, the `DataProvider` implementations are only
64/// guaranteed to match with this version's `*_unstable` providers. Use with caution.
65/// </div>
66pub struct Baked;
67
68#[cfg(feature = "compiled_data")]
69#[allow(unused_imports)]
70const _: () = {
71    use icu_properties_data::*;
72    pub mod icu {
73        pub use crate as properties;
74        pub use icu_collections as collections;
75    }
76    make_provider!(Baked);
77    impl_property_binary_alnum_v1!(Baked);
78    impl_property_binary_alphabetic_v1!(Baked);
79    impl_property_binary_ascii_hex_digit_v1!(Baked);
80    impl_property_binary_basic_emoji_v1!(Baked);
81    impl_property_binary_bidi_control_v1!(Baked);
82    impl_property_binary_bidi_mirrored_v1!(Baked);
83    impl_property_binary_blank_v1!(Baked);
84    impl_property_binary_case_ignorable_v1!(Baked);
85    impl_property_binary_case_sensitive_v1!(Baked);
86    impl_property_binary_cased_v1!(Baked);
87    impl_property_binary_changes_when_casefolded_v1!(Baked);
88    impl_property_binary_changes_when_casemapped_v1!(Baked);
89    impl_property_binary_changes_when_lowercased_v1!(Baked);
90    impl_property_binary_changes_when_nfkc_casefolded_v1!(Baked);
91    impl_property_binary_changes_when_titlecased_v1!(Baked);
92    impl_property_binary_changes_when_uppercased_v1!(Baked);
93    impl_property_binary_dash_v1!(Baked);
94    impl_property_binary_default_ignorable_code_point_v1!(Baked);
95    impl_property_binary_deprecated_v1!(Baked);
96    impl_property_binary_diacritic_v1!(Baked);
97    impl_property_binary_emoji_component_v1!(Baked);
98    impl_property_binary_emoji_modifier_base_v1!(Baked);
99    impl_property_binary_emoji_modifier_v1!(Baked);
100    impl_property_binary_emoji_presentation_v1!(Baked);
101    impl_property_binary_emoji_v1!(Baked);
102    impl_property_binary_extended_pictographic_v1!(Baked);
103    impl_property_binary_extender_v1!(Baked);
104    impl_property_binary_full_composition_exclusion_v1!(Baked);
105    impl_property_binary_graph_v1!(Baked);
106    impl_property_binary_grapheme_base_v1!(Baked);
107    impl_property_binary_grapheme_extend_v1!(Baked);
108    impl_property_binary_grapheme_link_v1!(Baked);
109    impl_property_binary_hex_digit_v1!(Baked);
110    impl_property_binary_hyphen_v1!(Baked);
111    impl_property_binary_id_compat_math_continue_v1!(Baked);
112    impl_property_binary_id_compat_math_start_v1!(Baked);
113    impl_property_binary_id_continue_v1!(Baked);
114    impl_property_binary_id_start_v1!(Baked);
115    impl_property_binary_ideographic_v1!(Baked);
116    impl_property_binary_ids_binary_operator_v1!(Baked);
117    impl_property_binary_ids_trinary_operator_v1!(Baked);
118    impl_property_binary_ids_unary_operator_v1!(Baked);
119    impl_property_binary_join_control_v1!(Baked);
120    impl_property_binary_logical_order_exception_v1!(Baked);
121    impl_property_binary_lowercase_v1!(Baked);
122    impl_property_binary_math_v1!(Baked);
123    impl_property_binary_modifier_combining_mark_v1!(Baked);
124    impl_property_binary_nfc_inert_v1!(Baked);
125    impl_property_binary_nfd_inert_v1!(Baked);
126    impl_property_binary_nfkc_inert_v1!(Baked);
127    impl_property_binary_nfkd_inert_v1!(Baked);
128    impl_property_binary_noncharacter_code_point_v1!(Baked);
129    impl_property_binary_pattern_syntax_v1!(Baked);
130    impl_property_binary_pattern_white_space_v1!(Baked);
131    impl_property_binary_prepended_concatenation_mark_v1!(Baked);
132    impl_property_binary_print_v1!(Baked);
133    impl_property_binary_quotation_mark_v1!(Baked);
134    impl_property_binary_radical_v1!(Baked);
135    impl_property_binary_regional_indicator_v1!(Baked);
136    impl_property_binary_segment_starter_v1!(Baked);
137    impl_property_binary_sentence_terminal_v1!(Baked);
138    impl_property_binary_soft_dotted_v1!(Baked);
139    impl_property_binary_terminal_punctuation_v1!(Baked);
140    impl_property_binary_unified_ideograph_v1!(Baked);
141    impl_property_binary_uppercase_v1!(Baked);
142    impl_property_binary_variation_selector_v1!(Baked);
143    impl_property_binary_white_space_v1!(Baked);
144    impl_property_binary_xdigit_v1!(Baked);
145    impl_property_binary_xid_continue_v1!(Baked);
146    impl_property_binary_xid_start_v1!(Baked);
147    impl_property_enum_bidi_class_v1!(Baked);
148    impl_property_enum_bidi_mirroring_glyph_v1!(Baked);
149    impl_property_enum_canonical_combining_class_v1!(Baked);
150    impl_property_enum_east_asian_width_v1!(Baked);
151    impl_property_enum_general_category_v1!(Baked);
152    impl_property_enum_grapheme_cluster_break_v1!(Baked);
153    impl_property_enum_hangul_syllable_type_v1!(Baked);
154    impl_property_enum_indic_conjunct_break_v1!(Baked);
155    impl_property_enum_indic_syllabic_category_v1!(Baked);
156    impl_property_enum_joining_type_v1!(Baked);
157    impl_property_enum_line_break_v1!(Baked);
158    impl_property_enum_script_v1!(Baked);
159    impl_property_enum_sentence_break_v1!(Baked);
160    impl_property_enum_vertical_orientation_v1!(Baked);
161    impl_property_enum_word_break_v1!(Baked);
162    impl_property_name_long_bidi_class_v1!(Baked);
163    #[cfg(feature = "alloc")]
164    impl_property_name_long_canonical_combining_class_v1!(Baked);
165    impl_property_name_long_east_asian_width_v1!(Baked);
166    impl_property_name_long_general_category_v1!(Baked);
167    impl_property_name_long_grapheme_cluster_break_v1!(Baked);
168    impl_property_name_long_hangul_syllable_type_v1!(Baked);
169    impl_property_name_long_indic_syllabic_category_v1!(Baked);
170    impl_property_name_long_joining_type_v1!(Baked);
171    impl_property_name_long_line_break_v1!(Baked);
172    impl_property_name_long_script_v1!(Baked);
173    impl_property_name_long_sentence_break_v1!(Baked);
174    impl_property_name_long_vertical_orientation_v1!(Baked);
175    impl_property_name_long_word_break_v1!(Baked);
176    impl_property_name_parse_bidi_class_v1!(Baked);
177    impl_property_name_parse_canonical_combining_class_v1!(Baked);
178    impl_property_name_parse_east_asian_width_v1!(Baked);
179    impl_property_name_parse_general_category_mask_v1!(Baked);
180    impl_property_name_parse_general_category_v1!(Baked);
181    impl_property_name_parse_grapheme_cluster_break_v1!(Baked);
182    impl_property_name_parse_hangul_syllable_type_v1!(Baked);
183    impl_property_name_parse_indic_syllabic_category_v1!(Baked);
184    impl_property_name_parse_joining_type_v1!(Baked);
185    impl_property_name_parse_line_break_v1!(Baked);
186    impl_property_name_parse_script_v1!(Baked);
187    impl_property_name_parse_sentence_break_v1!(Baked);
188    impl_property_name_parse_vertical_orientation_v1!(Baked);
189    impl_property_name_parse_word_break_v1!(Baked);
190    impl_property_name_short_bidi_class_v1!(Baked);
191    #[cfg(feature = "alloc")]
192    impl_property_name_short_canonical_combining_class_v1!(Baked);
193    impl_property_name_short_east_asian_width_v1!(Baked);
194    impl_property_name_short_general_category_v1!(Baked);
195    impl_property_name_short_grapheme_cluster_break_v1!(Baked);
196    impl_property_name_short_hangul_syllable_type_v1!(Baked);
197    impl_property_name_short_indic_syllabic_category_v1!(Baked);
198    impl_property_name_short_joining_type_v1!(Baked);
199    impl_property_name_short_line_break_v1!(Baked);
200    impl_property_name_short_script_v1!(Baked);
201    impl_property_name_short_sentence_break_v1!(Baked);
202    impl_property_name_short_vertical_orientation_v1!(Baked);
203    impl_property_name_short_word_break_v1!(Baked);
204    impl_property_script_with_extensions_v1!(Baked);
205};
206
207icu_provider::data_marker!(
208    /// `PropertyBinaryAlnumV1`
209    PropertyBinaryAlnumV1,
210    PropertyCodePointSet<'static>,
211    is_singleton = true
212);
213icu_provider::data_marker!(
214    /// `PropertyBinaryAlphabeticV1`
215    PropertyBinaryAlphabeticV1,
216    PropertyCodePointSet<'static>,
217    is_singleton = true
218);
219icu_provider::data_marker!(
220    /// `PropertyBinaryAsciiHexDigitV1`
221    PropertyBinaryAsciiHexDigitV1,
222    PropertyCodePointSet<'static>,
223    is_singleton = true
224);
225icu_provider::data_marker!(
226    /// `PropertyBinaryBidiControlV1`
227    PropertyBinaryBidiControlV1,
228    PropertyCodePointSet<'static>,
229    is_singleton = true
230);
231icu_provider::data_marker!(
232    /// `PropertyBinaryBidiMirroredV1`
233    PropertyBinaryBidiMirroredV1,
234    PropertyCodePointSet<'static>,
235    is_singleton = true
236);
237icu_provider::data_marker!(
238    /// `PropertyBinaryBlankV1`
239    PropertyBinaryBlankV1,
240    PropertyCodePointSet<'static>,
241    is_singleton = true
242);
243icu_provider::data_marker!(
244    /// `PropertyBinaryCasedV1`
245    PropertyBinaryCasedV1,
246    PropertyCodePointSet<'static>,
247    is_singleton = true
248);
249icu_provider::data_marker!(
250    /// `PropertyBinaryCaseIgnorableV1`
251    PropertyBinaryCaseIgnorableV1,
252    PropertyCodePointSet<'static>,
253    is_singleton = true
254);
255icu_provider::data_marker!(
256    /// `PropertyBinaryCaseSensitiveV1`
257    PropertyBinaryCaseSensitiveV1,
258    PropertyCodePointSet<'static>,
259    is_singleton = true
260);
261icu_provider::data_marker!(
262    /// `PropertyBinaryChangesWhenCasefoldedV1`
263    PropertyBinaryChangesWhenCasefoldedV1,
264    PropertyCodePointSet<'static>,
265    is_singleton = true
266);
267icu_provider::data_marker!(
268    /// `PropertyBinaryChangesWhenCasemappedV1`
269    PropertyBinaryChangesWhenCasemappedV1,
270    PropertyCodePointSet<'static>,
271    is_singleton = true
272);
273icu_provider::data_marker!(
274    /// `PropertyBinaryChangesWhenLowercasedV1`
275    PropertyBinaryChangesWhenLowercasedV1,
276    PropertyCodePointSet<'static>,
277    is_singleton = true
278);
279icu_provider::data_marker!(
280    /// `PropertyBinaryChangesWhenNfkcCasefoldedV1`
281    PropertyBinaryChangesWhenNfkcCasefoldedV1,
282    PropertyCodePointSet<'static>,
283    is_singleton = true
284);
285icu_provider::data_marker!(
286    /// `PropertyBinaryChangesWhenTitlecasedV1`
287    PropertyBinaryChangesWhenTitlecasedV1,
288    PropertyCodePointSet<'static>,
289    is_singleton = true
290);
291icu_provider::data_marker!(
292    /// `PropertyBinaryChangesWhenUppercasedV1`
293    PropertyBinaryChangesWhenUppercasedV1,
294    PropertyCodePointSet<'static>,
295    is_singleton = true
296);
297icu_provider::data_marker!(
298    /// `PropertyBinaryDashV1`
299    PropertyBinaryDashV1,
300    PropertyCodePointSet<'static>,
301    is_singleton = true
302);
303icu_provider::data_marker!(
304    /// `PropertyBinaryDefaultIgnorableCodePointV1`
305    PropertyBinaryDefaultIgnorableCodePointV1,
306    PropertyCodePointSet<'static>,
307    is_singleton = true
308);
309icu_provider::data_marker!(
310    /// `PropertyBinaryDeprecatedV1`
311    PropertyBinaryDeprecatedV1,
312    PropertyCodePointSet<'static>,
313    is_singleton = true
314);
315icu_provider::data_marker!(
316    /// `PropertyBinaryDiacriticV1`
317    PropertyBinaryDiacriticV1,
318    PropertyCodePointSet<'static>,
319    is_singleton = true
320);
321icu_provider::data_marker!(
322    /// `PropertyBinaryEmojiComponentV1`
323    PropertyBinaryEmojiComponentV1,
324    PropertyCodePointSet<'static>,
325    is_singleton = true
326);
327icu_provider::data_marker!(
328    /// `PropertyBinaryEmojiModifierBaseV1`
329    PropertyBinaryEmojiModifierBaseV1,
330    PropertyCodePointSet<'static>,
331    is_singleton = true
332);
333icu_provider::data_marker!(
334    /// `PropertyBinaryEmojiModifierV1`
335    PropertyBinaryEmojiModifierV1,
336    PropertyCodePointSet<'static>,
337    is_singleton = true
338);
339icu_provider::data_marker!(
340    /// `PropertyBinaryEmojiPresentationV1`
341    PropertyBinaryEmojiPresentationV1,
342    PropertyCodePointSet<'static>,
343    is_singleton = true
344);
345icu_provider::data_marker!(
346    /// `PropertyBinaryEmojiV1`
347    PropertyBinaryEmojiV1,
348    PropertyCodePointSet<'static>,
349    is_singleton = true
350);
351icu_provider::data_marker!(
352    /// `PropertyBinaryExtendedPictographicV1`
353    PropertyBinaryExtendedPictographicV1,
354    PropertyCodePointSet<'static>,
355    is_singleton = true
356);
357icu_provider::data_marker!(
358    /// `PropertyBinaryExtenderV1`
359    PropertyBinaryExtenderV1,
360    PropertyCodePointSet<'static>,
361    is_singleton = true
362);
363icu_provider::data_marker!(
364    /// `PropertyBinaryFullCompositionExclusionV1`
365    PropertyBinaryFullCompositionExclusionV1,
366    PropertyCodePointSet<'static>,
367    is_singleton = true
368);
369icu_provider::data_marker!(
370    /// `PropertyBinaryGraphemeBaseV1`
371    PropertyBinaryGraphemeBaseV1,
372    PropertyCodePointSet<'static>,
373    is_singleton = true
374);
375icu_provider::data_marker!(
376    /// `PropertyBinaryGraphemeExtendV1`
377    PropertyBinaryGraphemeExtendV1,
378    PropertyCodePointSet<'static>,
379    is_singleton = true
380);
381icu_provider::data_marker!(
382    /// `PropertyBinaryGraphemeLinkV1`
383    PropertyBinaryGraphemeLinkV1,
384    PropertyCodePointSet<'static>,
385    is_singleton = true
386);
387icu_provider::data_marker!(
388    /// `PropertyBinaryGraphV1`
389    PropertyBinaryGraphV1,
390    PropertyCodePointSet<'static>,
391    is_singleton = true
392);
393icu_provider::data_marker!(
394    /// `PropertyBinaryHexDigitV1`
395    PropertyBinaryHexDigitV1,
396    PropertyCodePointSet<'static>,
397    is_singleton = true
398);
399icu_provider::data_marker!(
400    /// `PropertyBinaryHyphenV1`
401    PropertyBinaryHyphenV1,
402    PropertyCodePointSet<'static>,
403    is_singleton = true
404);
405icu_provider::data_marker!(
406    /// `PropertyBinaryIdCompatMathContinueV1`
407    PropertyBinaryIdCompatMathContinueV1,
408    PropertyCodePointSet<'static>,
409    is_singleton = true
410);
411icu_provider::data_marker!(
412    /// `PropertyBinaryIdCompatMathStartV1`
413    PropertyBinaryIdCompatMathStartV1,
414    PropertyCodePointSet<'static>,
415    is_singleton = true
416);
417icu_provider::data_marker!(
418    /// `PropertyBinaryIdContinueV1`
419    PropertyBinaryIdContinueV1,
420    PropertyCodePointSet<'static>,
421    is_singleton = true
422);
423icu_provider::data_marker!(
424    /// `PropertyBinaryIdeographicV1`
425    PropertyBinaryIdeographicV1,
426    PropertyCodePointSet<'static>,
427    is_singleton = true
428);
429icu_provider::data_marker!(
430    /// `PropertyBinaryIdsBinaryOperatorV1`
431    PropertyBinaryIdsBinaryOperatorV1,
432    PropertyCodePointSet<'static>,
433    is_singleton = true
434);
435icu_provider::data_marker!(
436    /// `PropertyBinaryIdStartV1`
437    PropertyBinaryIdStartV1,
438    PropertyCodePointSet<'static>,
439    is_singleton = true
440);
441icu_provider::data_marker!(
442    /// `PropertyBinaryIdsTrinaryOperatorV1`
443    PropertyBinaryIdsTrinaryOperatorV1,
444    PropertyCodePointSet<'static>,
445    is_singleton = true
446);
447icu_provider::data_marker!(
448    /// `PropertyBinaryIdsUnaryOperatorV1`
449    PropertyBinaryIdsUnaryOperatorV1,
450    PropertyCodePointSet<'static>,
451    is_singleton = true
452);
453icu_provider::data_marker!(
454    /// `PropertyBinaryJoinControlV1`
455    PropertyBinaryJoinControlV1,
456    PropertyCodePointSet<'static>,
457    is_singleton = true
458);
459icu_provider::data_marker!(
460    /// `PropertyBinaryLogicalOrderExceptionV1`
461    PropertyBinaryLogicalOrderExceptionV1,
462    PropertyCodePointSet<'static>,
463    is_singleton = true
464);
465icu_provider::data_marker!(
466    /// `PropertyBinaryLowercaseV1`
467    PropertyBinaryLowercaseV1,
468    PropertyCodePointSet<'static>,
469    is_singleton = true
470);
471icu_provider::data_marker!(
472    /// `PropertyBinaryMathV1`
473    PropertyBinaryMathV1,
474    PropertyCodePointSet<'static>,
475    is_singleton = true
476);
477icu_provider::data_marker!(
478    /// `PropertyBinaryModifierCombiningMarkV1`
479    PropertyBinaryModifierCombiningMarkV1,
480    PropertyCodePointSet<'static>,
481    is_singleton = true
482);
483icu_provider::data_marker!(
484    /// `PropertyBinaryNfcInertV1`
485    PropertyBinaryNfcInertV1,
486    PropertyCodePointSet<'static>,
487    is_singleton = true
488);
489icu_provider::data_marker!(
490    /// `PropertyBinaryNfdInertV1`
491    PropertyBinaryNfdInertV1,
492    PropertyCodePointSet<'static>,
493    is_singleton = true
494);
495icu_provider::data_marker!(
496    /// `PropertyBinaryNfkcInertV1`
497    PropertyBinaryNfkcInertV1,
498    PropertyCodePointSet<'static>,
499    is_singleton = true
500);
501icu_provider::data_marker!(
502    /// `PropertyBinaryNfkdInertV1`
503    PropertyBinaryNfkdInertV1,
504    PropertyCodePointSet<'static>,
505    is_singleton = true
506);
507icu_provider::data_marker!(
508    /// `PropertyBinaryNoncharacterCodePointV1`
509    PropertyBinaryNoncharacterCodePointV1,
510    PropertyCodePointSet<'static>,
511    is_singleton = true
512);
513icu_provider::data_marker!(
514    /// `PropertyBinaryPatternSyntaxV1`
515    PropertyBinaryPatternSyntaxV1,
516    PropertyCodePointSet<'static>,
517    is_singleton = true
518);
519icu_provider::data_marker!(
520    /// `PropertyBinaryPatternWhiteSpaceV1`
521    PropertyBinaryPatternWhiteSpaceV1,
522    PropertyCodePointSet<'static>,
523    is_singleton = true
524);
525icu_provider::data_marker!(
526    /// `PropertyBinaryPrependedConcatenationMarkV1`
527    PropertyBinaryPrependedConcatenationMarkV1,
528    PropertyCodePointSet<'static>,
529    is_singleton = true
530);
531icu_provider::data_marker!(
532    /// `PropertyBinaryPrintV1`
533    PropertyBinaryPrintV1,
534    PropertyCodePointSet<'static>,
535    is_singleton = true
536);
537icu_provider::data_marker!(
538    /// `PropertyBinaryQuotationMarkV1`
539    PropertyBinaryQuotationMarkV1,
540    PropertyCodePointSet<'static>,
541    is_singleton = true
542);
543icu_provider::data_marker!(
544    /// `PropertyBinaryRadicalV1`
545    PropertyBinaryRadicalV1,
546    PropertyCodePointSet<'static>,
547    is_singleton = true
548);
549icu_provider::data_marker!(
550    /// `PropertyBinaryRegionalIndicatorV1`
551    PropertyBinaryRegionalIndicatorV1,
552    PropertyCodePointSet<'static>,
553    is_singleton = true
554);
555icu_provider::data_marker!(
556    /// `PropertyBinarySegmentStarterV1`
557    PropertyBinarySegmentStarterV1,
558    PropertyCodePointSet<'static>,
559    is_singleton = true
560);
561icu_provider::data_marker!(
562    /// `PropertyBinarySentenceTerminalV1`
563    PropertyBinarySentenceTerminalV1,
564    PropertyCodePointSet<'static>,
565    is_singleton = true
566);
567icu_provider::data_marker!(
568    /// `PropertyBinarySoftDottedV1`
569    PropertyBinarySoftDottedV1,
570    PropertyCodePointSet<'static>,
571    is_singleton = true
572);
573icu_provider::data_marker!(
574    /// `PropertyBinaryTerminalPunctuationV1`
575    PropertyBinaryTerminalPunctuationV1,
576    PropertyCodePointSet<'static>,
577    is_singleton = true
578);
579icu_provider::data_marker!(
580    /// `PropertyBinaryUnifiedIdeographV1`
581    PropertyBinaryUnifiedIdeographV1,
582    PropertyCodePointSet<'static>,
583    is_singleton = true
584);
585icu_provider::data_marker!(
586    /// `PropertyBinaryUppercaseV1`
587    PropertyBinaryUppercaseV1,
588    PropertyCodePointSet<'static>,
589    is_singleton = true
590);
591icu_provider::data_marker!(
592    /// `PropertyBinaryVariationSelectorV1`
593    PropertyBinaryVariationSelectorV1,
594    PropertyCodePointSet<'static>,
595    is_singleton = true
596);
597icu_provider::data_marker!(
598    /// `PropertyBinaryWhiteSpaceV1`
599    PropertyBinaryWhiteSpaceV1,
600    PropertyCodePointSet<'static>,
601    is_singleton = true
602);
603icu_provider::data_marker!(
604    /// `PropertyBinaryXdigitV1`
605    PropertyBinaryXdigitV1,
606    PropertyCodePointSet<'static>,
607    is_singleton = true
608);
609icu_provider::data_marker!(
610    /// `PropertyBinaryXidContinueV1`
611    PropertyBinaryXidContinueV1,
612    PropertyCodePointSet<'static>,
613    is_singleton = true
614);
615icu_provider::data_marker!(
616    /// `PropertyBinaryXidStartV1`
617    PropertyBinaryXidStartV1,
618    PropertyCodePointSet<'static>,
619    is_singleton = true
620);
621icu_provider::data_marker!(
622    /// Data marker for the 'BidiClass' Unicode property
623    PropertyEnumBidiClassV1,
624    PropertyCodePointMap<'static, crate::props::BidiClass>,
625    is_singleton = true,
626);
627icu_provider::data_marker!(
628    /// Data marker for the 'CanonicalCombiningClass' Unicode property
629    PropertyEnumCanonicalCombiningClassV1,
630    PropertyCodePointMap<'static, crate::props::CanonicalCombiningClass>,
631    is_singleton = true,
632);
633icu_provider::data_marker!(
634    /// Data marker for the 'EastAsianWidth' Unicode property
635    PropertyEnumEastAsianWidthV1,
636    PropertyCodePointMap<'static, crate::props::EastAsianWidth>,
637    is_singleton = true,
638);
639icu_provider::data_marker!(
640    /// Data marker for the 'GeneralCategory' Unicode property
641    PropertyEnumGeneralCategoryV1,
642    PropertyCodePointMap<'static, crate::props::GeneralCategory>,
643    is_singleton = true,
644);
645icu_provider::data_marker!(
646    /// Data marker for the 'GraphemeClusterBreak' Unicode property
647    PropertyEnumGraphemeClusterBreakV1,
648    PropertyCodePointMap<'static, crate::props::GraphemeClusterBreak>,
649    is_singleton = true,
650);
651icu_provider::data_marker!(
652    /// Data marker for the 'HangulSyllableType' Unicode property
653    PropertyEnumHangulSyllableTypeV1,
654    PropertyCodePointMap<'static, crate::props::HangulSyllableType>,
655    is_singleton = true,
656);
657icu_provider::data_marker!(
658    /// Data marker for the 'IndicConjunctBreak' Unicode property
659    PropertyEnumIndicConjunctBreakV1,
660    PropertyCodePointMap<'static, crate::props::IndicConjunctBreak>,
661    is_singleton = true,
662);
663icu_provider::data_marker!(
664    /// Data marker for the 'IndicSyllabicCategory' Unicode property
665    PropertyEnumIndicSyllabicCategoryV1,
666    PropertyCodePointMap<'static, crate::props::IndicSyllabicCategory>,
667    is_singleton = true,
668);
669icu_provider::data_marker!(
670    /// Data marker for the 'JoiningType' Unicode property
671    PropertyEnumJoiningTypeV1,
672    PropertyCodePointMap<'static, crate::props::JoiningType>,
673    is_singleton = true,
674);
675icu_provider::data_marker!(
676    /// Data marker for the 'LineBreak' Unicode property
677    PropertyEnumLineBreakV1,
678    PropertyCodePointMap<'static, crate::props::LineBreak>,
679    is_singleton = true,
680);
681icu_provider::data_marker!(
682    /// Data marker for the 'Script' Unicode property
683    PropertyEnumScriptV1,
684    PropertyCodePointMap<'static, crate::props::Script>,
685    is_singleton = true,
686);
687icu_provider::data_marker!(
688    /// Data marker for the 'SentenceBreak' Unicode property
689    PropertyEnumSentenceBreakV1,
690    PropertyCodePointMap<'static, crate::props::SentenceBreak>,
691    is_singleton = true,
692);
693icu_provider::data_marker!(
694    /// Data marker for the 'Vertical_Orientation' Unicode property
695    PropertyEnumVerticalOrientationV1,
696    PropertyCodePointMap<'static, crate::props::VerticalOrientation>,
697    is_singleton = true,
698);
699icu_provider::data_marker!(
700    /// Data marker for the 'WordBreak' Unicode property
701    PropertyEnumWordBreakV1,
702    PropertyCodePointMap<'static, crate::props::WordBreak>,
703    is_singleton = true,
704);
705icu_provider::data_marker!(
706    /// Data marker for the 'BidiMirroringGlyph' Unicode property
707    PropertyEnumBidiMirroringGlyphV1,
708    PropertyCodePointMap<'static, crate::bidi::BidiMirroringGlyph>,
709    is_singleton = true,
710);
711icu_provider::data_marker!(
712    /// `PropertyBinaryBasicEmojiV1`
713    PropertyBinaryBasicEmojiV1,
714    PropertyUnicodeSet<'static>,
715    is_singleton = true
716);
717icu_provider::data_marker!(
718    /// `PropertyScriptWithExtensionsV1`
719    PropertyScriptWithExtensionsV1,
720    ScriptWithExtensionsProperty<'static>,
721    is_singleton = true
722);
723
724/// All data keys in this module.
725pub const MARKERS: &[DataMarkerInfo] = &[
726    PropertyNameLongBidiClassV1::INFO,
727    #[cfg(feature = "alloc")]
728    PropertyNameLongCanonicalCombiningClassV1::INFO,
729    PropertyNameLongEastAsianWidthV1::INFO,
730    PropertyNameLongGeneralCategoryV1::INFO,
731    PropertyNameLongGraphemeClusterBreakV1::INFO,
732    PropertyNameLongHangulSyllableTypeV1::INFO,
733    PropertyNameLongIndicSyllabicCategoryV1::INFO,
734    PropertyNameLongJoiningTypeV1::INFO,
735    PropertyNameLongLineBreakV1::INFO,
736    PropertyNameLongScriptV1::INFO,
737    PropertyNameLongSentenceBreakV1::INFO,
738    PropertyNameLongVerticalOrientationV1::INFO,
739    PropertyNameLongWordBreakV1::INFO,
740    PropertyNameParseBidiClassV1::INFO,
741    PropertyNameParseCanonicalCombiningClassV1::INFO,
742    PropertyNameParseEastAsianWidthV1::INFO,
743    PropertyNameParseGeneralCategoryMaskV1::INFO,
744    PropertyNameParseGeneralCategoryV1::INFO,
745    PropertyNameParseGraphemeClusterBreakV1::INFO,
746    PropertyNameParseHangulSyllableTypeV1::INFO,
747    PropertyNameParseIndicSyllabicCategoryV1::INFO,
748    PropertyNameParseJoiningTypeV1::INFO,
749    PropertyNameParseLineBreakV1::INFO,
750    PropertyNameParseScriptV1::INFO,
751    PropertyNameParseSentenceBreakV1::INFO,
752    PropertyNameParseVerticalOrientationV1::INFO,
753    PropertyNameParseWordBreakV1::INFO,
754    PropertyNameShortBidiClassV1::INFO,
755    #[cfg(feature = "alloc")]
756    PropertyNameShortCanonicalCombiningClassV1::INFO,
757    PropertyNameShortEastAsianWidthV1::INFO,
758    PropertyNameShortGeneralCategoryV1::INFO,
759    PropertyNameShortGraphemeClusterBreakV1::INFO,
760    PropertyNameShortHangulSyllableTypeV1::INFO,
761    PropertyNameShortIndicSyllabicCategoryV1::INFO,
762    PropertyNameShortJoiningTypeV1::INFO,
763    PropertyNameShortLineBreakV1::INFO,
764    PropertyNameShortScriptV1::INFO,
765    PropertyNameShortSentenceBreakV1::INFO,
766    PropertyNameShortVerticalOrientationV1::INFO,
767    PropertyNameShortWordBreakV1::INFO,
768    PropertyBinaryAlnumV1::INFO,
769    PropertyBinaryAlphabeticV1::INFO,
770    PropertyBinaryAsciiHexDigitV1::INFO,
771    PropertyBinaryBidiControlV1::INFO,
772    PropertyBinaryBidiMirroredV1::INFO,
773    PropertyBinaryBlankV1::INFO,
774    PropertyBinaryCasedV1::INFO,
775    PropertyBinaryCaseIgnorableV1::INFO,
776    PropertyBinaryCaseSensitiveV1::INFO,
777    PropertyBinaryChangesWhenCasefoldedV1::INFO,
778    PropertyBinaryChangesWhenCasemappedV1::INFO,
779    PropertyBinaryChangesWhenLowercasedV1::INFO,
780    PropertyBinaryChangesWhenNfkcCasefoldedV1::INFO,
781    PropertyBinaryChangesWhenTitlecasedV1::INFO,
782    PropertyBinaryChangesWhenUppercasedV1::INFO,
783    PropertyBinaryDashV1::INFO,
784    PropertyBinaryDefaultIgnorableCodePointV1::INFO,
785    PropertyBinaryDeprecatedV1::INFO,
786    PropertyBinaryDiacriticV1::INFO,
787    PropertyBinaryEmojiComponentV1::INFO,
788    PropertyBinaryEmojiModifierBaseV1::INFO,
789    PropertyBinaryEmojiModifierV1::INFO,
790    PropertyBinaryEmojiPresentationV1::INFO,
791    PropertyBinaryEmojiV1::INFO,
792    PropertyBinaryExtendedPictographicV1::INFO,
793    PropertyBinaryExtenderV1::INFO,
794    PropertyBinaryFullCompositionExclusionV1::INFO,
795    PropertyBinaryGraphemeBaseV1::INFO,
796    PropertyBinaryGraphemeExtendV1::INFO,
797    PropertyBinaryGraphemeLinkV1::INFO,
798    PropertyBinaryGraphV1::INFO,
799    PropertyBinaryHexDigitV1::INFO,
800    PropertyBinaryHyphenV1::INFO,
801    PropertyBinaryIdCompatMathContinueV1::INFO,
802    PropertyBinaryIdCompatMathStartV1::INFO,
803    PropertyBinaryIdContinueV1::INFO,
804    PropertyBinaryIdeographicV1::INFO,
805    PropertyBinaryIdsBinaryOperatorV1::INFO,
806    PropertyBinaryIdStartV1::INFO,
807    PropertyBinaryIdsTrinaryOperatorV1::INFO,
808    PropertyBinaryIdsUnaryOperatorV1::INFO,
809    PropertyBinaryJoinControlV1::INFO,
810    PropertyBinaryLogicalOrderExceptionV1::INFO,
811    PropertyBinaryLowercaseV1::INFO,
812    PropertyBinaryMathV1::INFO,
813    PropertyBinaryModifierCombiningMarkV1::INFO,
814    PropertyBinaryNfcInertV1::INFO,
815    PropertyBinaryNfdInertV1::INFO,
816    PropertyBinaryNfkcInertV1::INFO,
817    PropertyBinaryNfkdInertV1::INFO,
818    PropertyBinaryNoncharacterCodePointV1::INFO,
819    PropertyBinaryPatternSyntaxV1::INFO,
820    PropertyBinaryPatternWhiteSpaceV1::INFO,
821    PropertyBinaryPrependedConcatenationMarkV1::INFO,
822    PropertyBinaryPrintV1::INFO,
823    PropertyBinaryQuotationMarkV1::INFO,
824    PropertyBinaryRadicalV1::INFO,
825    PropertyBinaryRegionalIndicatorV1::INFO,
826    PropertyBinarySegmentStarterV1::INFO,
827    PropertyBinarySentenceTerminalV1::INFO,
828    PropertyBinarySoftDottedV1::INFO,
829    PropertyBinaryTerminalPunctuationV1::INFO,
830    PropertyBinaryUnifiedIdeographV1::INFO,
831    PropertyBinaryUppercaseV1::INFO,
832    PropertyBinaryVariationSelectorV1::INFO,
833    PropertyBinaryWhiteSpaceV1::INFO,
834    PropertyBinaryXdigitV1::INFO,
835    PropertyBinaryXidContinueV1::INFO,
836    PropertyBinaryXidStartV1::INFO,
837    PropertyEnumBidiClassV1::INFO,
838    PropertyEnumCanonicalCombiningClassV1::INFO,
839    PropertyEnumEastAsianWidthV1::INFO,
840    PropertyEnumGeneralCategoryV1::INFO,
841    PropertyEnumGraphemeClusterBreakV1::INFO,
842    PropertyEnumHangulSyllableTypeV1::INFO,
843    PropertyEnumIndicConjunctBreakV1::INFO,
844    PropertyEnumIndicSyllabicCategoryV1::INFO,
845    PropertyEnumJoiningTypeV1::INFO,
846    PropertyEnumLineBreakV1::INFO,
847    PropertyEnumScriptV1::INFO,
848    PropertyEnumSentenceBreakV1::INFO,
849    PropertyEnumVerticalOrientationV1::INFO,
850    PropertyEnumWordBreakV1::INFO,
851    PropertyEnumBidiMirroringGlyphV1::INFO,
852    PropertyBinaryBasicEmojiV1::INFO,
853    PropertyScriptWithExtensionsV1::INFO,
854];
855
856/// A set of characters which share a particular property value.
857///
858/// This data enum is extensible, more backends may be added in the future.
859/// Old data can be used with newer code but not vice versa.
860///
861/// <div class="stab unstable">
862/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
863/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
864/// to be stable, their Rust representation might not be. Use with caution.
865/// </div>
866#[derive(Debug, Eq, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
867#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
868#[cfg_attr(feature = "datagen", databake(path = icu_properties::provider))]
869#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
870#[non_exhaustive]
871pub enum PropertyCodePointSet<'data> {
872    /// The set of characters, represented as an inversion list
873    InversionList(#[cfg_attr(feature = "serde", serde(borrow))] CodePointInversionList<'data>),
874    // new variants should go BELOW existing ones
875    // Serde serializes based on variant name and index in the enum
876    // https://docs.rs/serde/latest/serde/trait.Serializer.html#tymethod.serialize_unit_variant
877}
878
879icu_provider::data_struct!(
880    PropertyCodePointSet<'_>,
881    #[cfg(feature = "datagen")]
882);
883
884// See CodePointSetData for documentation of these functions
885impl<'data> PropertyCodePointSet<'data> {
886    #[inline]
887    pub(crate) fn contains(&self, ch: char) -> bool {
888        match *self {
889            Self::InversionList(ref l) => l.contains(ch),
890        }
891    }
892
893    #[inline]
894    pub(crate) fn contains32(&self, ch: u32) -> bool {
895        match *self {
896            Self::InversionList(ref l) => l.contains32(ch),
897        }
898    }
899
900    #[inline]
901    pub(crate) fn iter_ranges(&self) -> impl Iterator<Item = RangeInclusive<u32>> + '_ {
902        match *self {
903            Self::InversionList(ref l) => l.iter_ranges(),
904        }
905    }
906
907    #[inline]
908    pub(crate) fn iter_ranges_complemented(
909        &self,
910    ) -> impl Iterator<Item = RangeInclusive<u32>> + '_ {
911        match *self {
912            Self::InversionList(ref l) => l.iter_ranges_complemented(),
913        }
914    }
915
916    #[inline]
917    pub(crate) fn from_code_point_inversion_list(l: CodePointInversionList<'static>) -> Self {
918        Self::InversionList(l)
919    }
920
921    #[inline]
922    pub(crate) fn as_code_point_inversion_list(
923        &'_ self,
924    ) -> Option<&'_ CodePointInversionList<'data>> {
925        match *self {
926            Self::InversionList(ref l) => Some(l),
927            // any other backing data structure that cannot return a CPInvList in O(1) time should return None
928        }
929    }
930
931    #[inline]
932    pub(crate) fn to_code_point_inversion_list(&self) -> CodePointInversionList<'_> {
933        match *self {
934            Self::InversionList(ref t) => ZeroFrom::zero_from(t),
935        }
936    }
937}
938
939/// A map efficiently storing data about individual characters.
940///
941/// This data enum is extensible, more backends may be added in the future.
942/// Old data can be used with newer code but not vice versa.
943///
944/// <div class="stab unstable">
945/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
946/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
947/// to be stable, their Rust representation might not be. Use with caution.
948/// </div>
949#[derive(Clone, Debug, Eq, PartialEq, yoke::Yokeable, zerofrom::ZeroFrom)]
950#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
951#[cfg_attr(feature = "datagen", databake(path = icu_properties::provider))]
952#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
953#[non_exhaustive]
954pub enum PropertyCodePointMap<'data, T: TrieValue> {
955    /// A codepoint trie storing the data
956    CodePointTrie(#[cfg_attr(feature = "serde", serde(borrow))] CodePointTrie<'data, T>),
957    // new variants should go BELOW existing ones
958    // Serde serializes based on variant name and index in the enum
959    // https://docs.rs/serde/latest/serde/trait.Serializer.html#tymethod.serialize_unit_variant
960}
961
962icu_provider::data_struct!(
963    <T: TrieValue> PropertyCodePointMap<'_, T>,
964    #[cfg(feature = "datagen")]
965);
966
967// See CodePointMapData for documentation of these functions
968impl<'data, T: TrieValue> PropertyCodePointMap<'data, T> {
969    #[inline]
970    pub(crate) fn get32(&self, ch: u32) -> T {
971        match *self {
972            Self::CodePointTrie(ref t) => t.get32(ch),
973        }
974    }
975
976    #[inline]
977    pub(crate) fn get(&self, c: char) -> T {
978        match *self {
979            Self::CodePointTrie(ref t) => t.get(c),
980        }
981    }
982
983    #[inline]
984    #[cfg(feature = "alloc")]
985    pub(crate) fn try_into_converted<P>(
986        self,
987    ) -> Result<PropertyCodePointMap<'data, P>, zerovec::ule::UleError>
988    where
989        P: TrieValue,
990    {
991        match self {
992            Self::CodePointTrie(t) => t
993                .try_into_converted()
994                .map(PropertyCodePointMap::CodePointTrie),
995        }
996    }
997
998    #[inline]
999    #[cfg(feature = "alloc")]
1000    pub(crate) fn get_set_for_value(&self, value: T) -> CodePointInversionList<'static> {
1001        match *self {
1002            Self::CodePointTrie(ref t) => t.get_set_for_value(value),
1003        }
1004    }
1005
1006    #[inline]
1007    pub(crate) fn iter_ranges(&self) -> impl Iterator<Item = CodePointMapRange<T>> + '_ {
1008        match *self {
1009            Self::CodePointTrie(ref t) => t.iter_ranges(),
1010        }
1011    }
1012    #[inline]
1013    pub(crate) fn iter_ranges_mapped<'a, U: Eq + 'a>(
1014        &'a self,
1015        map: impl FnMut(T) -> U + Copy + 'a,
1016    ) -> impl Iterator<Item = CodePointMapRange<U>> + 'a {
1017        match *self {
1018            Self::CodePointTrie(ref t) => t.iter_ranges_mapped(map),
1019        }
1020    }
1021
1022    #[inline]
1023    pub(crate) fn from_code_point_trie(trie: CodePointTrie<'static, T>) -> Self {
1024        Self::CodePointTrie(trie)
1025    }
1026
1027    #[inline]
1028    pub(crate) fn as_code_point_trie(&self) -> Option<&CodePointTrie<'data, T>> {
1029        match *self {
1030            Self::CodePointTrie(ref t) => Some(t),
1031            // any other backing data structure that cannot return a CPT in O(1) time should return None
1032        }
1033    }
1034
1035    #[inline]
1036    pub(crate) fn to_code_point_trie(&self) -> CodePointTrie<'_, T> {
1037        match *self {
1038            Self::CodePointTrie(ref t) => ZeroFrom::zero_from(t),
1039        }
1040    }
1041}
1042
1043/// A set of characters and strings which share a particular property value.
1044///
1045/// <div class="stab unstable">
1046/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
1047/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
1048/// to be stable, their Rust representation might not be. Use with caution.
1049/// </div>
1050#[derive(Debug, Eq, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
1051#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
1052#[cfg_attr(feature = "datagen", databake(path = icu_properties::provider))]
1053#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
1054#[non_exhaustive]
1055pub enum PropertyUnicodeSet<'data> {
1056    /// A set representing characters in an inversion list, and the strings in a list.
1057    CPInversionListStrList(
1058        #[cfg_attr(feature = "serde", serde(borrow))] CodePointInversionListAndStringList<'data>,
1059    ),
1060    // new variants should go BELOW existing ones
1061    // Serde serializes based on variant name and index in the enum
1062    // https://docs.rs/serde/latest/serde/trait.Serializer.html#tymethod.serialize_unit_variant
1063}
1064
1065icu_provider::data_struct!(
1066    PropertyUnicodeSet<'_>,
1067    #[cfg(feature = "datagen")]
1068);
1069
1070impl<'data> PropertyUnicodeSet<'data> {
1071    #[inline]
1072    pub(crate) fn contains_str(&self, s: &str) -> bool {
1073        match *self {
1074            Self::CPInversionListStrList(ref l) => l.contains_str(s),
1075        }
1076    }
1077
1078    #[inline]
1079    pub(crate) fn contains32(&self, cp: u32) -> bool {
1080        match *self {
1081            Self::CPInversionListStrList(ref l) => l.contains32(cp),
1082        }
1083    }
1084
1085    #[inline]
1086    pub(crate) fn contains(&self, ch: char) -> bool {
1087        match *self {
1088            Self::CPInversionListStrList(ref l) => l.contains(ch),
1089        }
1090    }
1091
1092    #[inline]
1093    pub(crate) fn from_code_point_inversion_list_string_list(
1094        l: CodePointInversionListAndStringList<'static>,
1095    ) -> Self {
1096        Self::CPInversionListStrList(l)
1097    }
1098
1099    #[inline]
1100    pub(crate) fn as_code_point_inversion_list_string_list(
1101        &'_ self,
1102    ) -> Option<&'_ CodePointInversionListAndStringList<'data>> {
1103        match *self {
1104            Self::CPInversionListStrList(ref l) => Some(l),
1105            // any other backing data structure that cannot return a CPInversionListStrList in O(1) time should return None
1106        }
1107    }
1108
1109    #[inline]
1110    pub(crate) fn to_code_point_inversion_list_string_list(
1111        &self,
1112    ) -> CodePointInversionListAndStringList<'_> {
1113        match *self {
1114            Self::CPInversionListStrList(ref t) => ZeroFrom::zero_from(t),
1115        }
1116    }
1117}
1118
1119/// A struct that efficiently stores `Script` and `Script_Extensions` property data.
1120///
1121/// <div class="stab unstable">
1122/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
1123/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
1124/// to be stable, their Rust representation might not be. Use with caution.
1125/// </div>
1126#[derive(Debug, Eq, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
1127#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
1128#[cfg_attr(feature = "datagen", databake(path = icu_properties::provider))]
1129#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
1130pub struct ScriptWithExtensionsProperty<'data> {
1131    /// Note: The `ScriptWithExt` values in this array will assume a 12-bit layout. The 2
1132    /// higher order bits 11..10 will indicate how to deduce the Script value and
1133    /// Script_Extensions value, nearly matching the representation
1134    /// [in ICU](https://github.com/unicode-org/icu/blob/main/icu4c/source/common/uprops.h):
1135    ///
1136    /// | High order 2 bits value | Script                                                 | Script_Extensions                                              |
1137    /// |-------------------------|--------------------------------------------------------|----------------------------------------------------------------|
1138    /// | 3                       | First value in sub-array, index given by lower 10 bits | Sub-array excluding first value, index given by lower 10 bits  |
1139    /// | 2                       | Script=Inherited                                       | Entire sub-array, index given by lower 10 bits                 |
1140    /// | 1                       | Script=Common                                          | Entire sub-array, index given by lower 10 bits                 |
1141    /// | 0                       | Value in lower 10 bits                                 | `[ Script value ]` single-element array                        |
1142    ///
1143    /// When the lower 10 bits of the value are used as an index, that index is
1144    /// used for the outer-level vector of the nested `extensions` structure.
1145    #[cfg_attr(feature = "serde", serde(borrow))]
1146    pub trie: CodePointTrie<'data, ScriptWithExt>,
1147
1148    /// This companion structure stores Script_Extensions values, which are
1149    /// themselves arrays / vectors. This structure only stores the values for
1150    /// cases in which `scx(cp) != [ sc(cp) ]`. Each sub-vector is distinct. The
1151    /// sub-vector represents the Script_Extensions array value for a code point,
1152    /// and may also indicate Script value, as described for the `trie` field.
1153    #[cfg_attr(feature = "serde", serde(borrow))]
1154    pub extensions: VarZeroVec<'data, ZeroSlice<Script>>,
1155}
1156
1157icu_provider::data_struct!(
1158    ScriptWithExtensionsProperty<'_>,
1159    #[cfg(feature = "datagen")]
1160);