// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).

// Provider structs must be stable
#![allow(clippy::exhaustive_structs, clippy::exhaustive_enums)]

//! 🚧 \[Unstable\] Data provider struct definitions for this ICU4X component.
//!
//! <div class="stab unstable">
//! 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
//! including in SemVer minor releases. While the serde representation of data structs is guaranteed
//! to be stable, their Rust representation might not be. Use with caution.
//! </div>
//!
//! Read more about data providers: [`icu_provider`]

pub mod names;

pub use names::{
    PropertyNameLongBidiClassV1, PropertyNameLongCanonicalCombiningClassV1,
    PropertyNameLongEastAsianWidthV1, PropertyNameLongGeneralCategoryV1,
    PropertyNameLongGraphemeClusterBreakV1, PropertyNameLongHangulSyllableTypeV1,
    PropertyNameLongIndicSyllabicCategoryV1, PropertyNameLongJoiningTypeV1,
    PropertyNameLongLineBreakV1, PropertyNameLongScriptV1, PropertyNameLongSentenceBreakV1,
    PropertyNameLongVerticalOrientationV1, PropertyNameLongWordBreakV1,
    PropertyNameParseBidiClassV1, PropertyNameParseCanonicalCombiningClassV1,
    PropertyNameParseEastAsianWidthV1, PropertyNameParseGeneralCategoryMaskV1,
    PropertyNameParseGeneralCategoryV1, PropertyNameParseGraphemeClusterBreakV1,
    PropertyNameParseHangulSyllableTypeV1, PropertyNameParseIndicSyllabicCategoryV1,
    PropertyNameParseJoiningTypeV1, PropertyNameParseLineBreakV1, PropertyNameParseScriptV1,
    PropertyNameParseSentenceBreakV1, PropertyNameParseVerticalOrientationV1,
    PropertyNameParseWordBreakV1, PropertyNameShortBidiClassV1,
    PropertyNameShortCanonicalCombiningClassV1, PropertyNameShortEastAsianWidthV1,
    PropertyNameShortGeneralCategoryV1, PropertyNameShortGraphemeClusterBreakV1,
    PropertyNameShortHangulSyllableTypeV1, PropertyNameShortIndicSyllabicCategoryV1,
    PropertyNameShortJoiningTypeV1, PropertyNameShortLineBreakV1, PropertyNameShortScriptV1,
    PropertyNameShortSentenceBreakV1, PropertyNameShortVerticalOrientationV1,
    PropertyNameShortWordBreakV1,
};

pub use crate::props::gc::GeneralCategoryULE;
use crate::props::*;
use crate::script::ScriptWithExt;
use core::ops::RangeInclusive;
use icu_collections::codepointinvlist::CodePointInversionList;
use icu_collections::codepointinvliststringlist::CodePointInversionListAndStringList;
use icu_collections::codepointtrie::{CodePointMapRange, CodePointTrie, TrieValue};
use icu_provider::prelude::*;
use zerofrom::ZeroFrom;
use zerovec::{VarZeroVec, ZeroSlice};

#[cfg(feature = "compiled_data")]
#[derive(Debug)]
/// Baked data
///
/// <div class="stab unstable">
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
/// including in SemVer minor releases. In particular, the `DataProvider` implementations are only
/// guaranteed to match with this version's `*_unstable` providers. Use with caution.
/// </div>
pub struct Baked;

#[cfg(feature = "compiled_data")]
#[allow(unused_imports)]
const _: () = {
    use icu_properties_data::*;
    pub mod icu {
        pub use crate as properties;
        pub use icu_collections as collections;
    }
    make_provider!(Baked);
    impl_property_binary_alnum_v1!(Baked);
    impl_property_binary_alphabetic_v1!(Baked);
    impl_property_binary_ascii_hex_digit_v1!(Baked);
    impl_property_binary_basic_emoji_v1!(Baked);
    impl_property_binary_bidi_control_v1!(Baked);
    impl_property_binary_bidi_mirrored_v1!(Baked);
    impl_property_binary_blank_v1!(Baked);
    impl_property_binary_case_ignorable_v1!(Baked);
    impl_property_binary_case_sensitive_v1!(Baked);
    impl_property_binary_cased_v1!(Baked);
    impl_property_binary_changes_when_casefolded_v1!(Baked);
    impl_property_binary_changes_when_casemapped_v1!(Baked);
    impl_property_binary_changes_when_lowercased_v1!(Baked);
    impl_property_binary_changes_when_nfkc_casefolded_v1!(Baked);
    impl_property_binary_changes_when_titlecased_v1!(Baked);
    impl_property_binary_changes_when_uppercased_v1!(Baked);
    impl_property_binary_dash_v1!(Baked);
    impl_property_binary_default_ignorable_code_point_v1!(Baked);
    impl_property_binary_deprecated_v1!(Baked);
    impl_property_binary_diacritic_v1!(Baked);
    impl_property_binary_emoji_component_v1!(Baked);
    impl_property_binary_emoji_modifier_base_v1!(Baked);
    impl_property_binary_emoji_modifier_v1!(Baked);
    impl_property_binary_emoji_presentation_v1!(Baked);
    impl_property_binary_emoji_v1!(Baked);
    impl_property_binary_extended_pictographic_v1!(Baked);
    impl_property_binary_extender_v1!(Baked);
    impl_property_binary_full_composition_exclusion_v1!(Baked);
    impl_property_binary_graph_v1!(Baked);
    impl_property_binary_grapheme_base_v1!(Baked);
    impl_property_binary_grapheme_extend_v1!(Baked);
    impl_property_binary_grapheme_link_v1!(Baked);
    impl_property_binary_hex_digit_v1!(Baked);
    impl_property_binary_hyphen_v1!(Baked);
    impl_property_binary_id_continue_v1!(Baked);
    impl_property_binary_id_start_v1!(Baked);
    impl_property_binary_ideographic_v1!(Baked);
    impl_property_binary_ids_binary_operator_v1!(Baked);
    impl_property_binary_ids_trinary_operator_v1!(Baked);
    impl_property_binary_join_control_v1!(Baked);
    impl_property_binary_logical_order_exception_v1!(Baked);
    impl_property_binary_lowercase_v1!(Baked);
    impl_property_binary_math_v1!(Baked);
    impl_property_binary_nfc_inert_v1!(Baked);
    impl_property_binary_nfd_inert_v1!(Baked);
    impl_property_binary_nfkc_inert_v1!(Baked);
    impl_property_binary_nfkd_inert_v1!(Baked);
    impl_property_binary_noncharacter_code_point_v1!(Baked);
    impl_property_binary_pattern_syntax_v1!(Baked);
    impl_property_binary_pattern_white_space_v1!(Baked);
    impl_property_binary_prepended_concatenation_mark_v1!(Baked);
    impl_property_binary_print_v1!(Baked);
    impl_property_binary_quotation_mark_v1!(Baked);
    impl_property_binary_radical_v1!(Baked);
    impl_property_binary_regional_indicator_v1!(Baked);
    impl_property_binary_segment_starter_v1!(Baked);
    impl_property_binary_sentence_terminal_v1!(Baked);
    impl_property_binary_soft_dotted_v1!(Baked);
    impl_property_binary_terminal_punctuation_v1!(Baked);
    impl_property_binary_unified_ideograph_v1!(Baked);
    impl_property_binary_uppercase_v1!(Baked);
    impl_property_binary_variation_selector_v1!(Baked);
    impl_property_binary_white_space_v1!(Baked);
    impl_property_binary_xdigit_v1!(Baked);
    impl_property_binary_xid_continue_v1!(Baked);
    impl_property_binary_xid_start_v1!(Baked);
    impl_property_enum_bidi_class_v1!(Baked);
    impl_property_enum_bidi_mirroring_glyph_v1!(Baked);
    impl_property_enum_canonical_combining_class_v1!(Baked);
    impl_property_enum_east_asian_width_v1!(Baked);
    impl_property_enum_general_category_v1!(Baked);
    impl_property_enum_grapheme_cluster_break_v1!(Baked);
    impl_property_enum_hangul_syllable_type_v1!(Baked);
    impl_property_enum_indic_conjunct_break_v1!(Baked);
    impl_property_enum_indic_syllabic_category_v1!(Baked);
    impl_property_enum_joining_type_v1!(Baked);
    impl_property_enum_line_break_v1!(Baked);
    impl_property_enum_script_v1!(Baked);
    impl_property_enum_sentence_break_v1!(Baked);
    impl_property_enum_vertical_orientation_v1!(Baked);
    impl_property_enum_word_break_v1!(Baked);
    impl_property_name_long_bidi_class_v1!(Baked);
    impl_property_name_long_canonical_combining_class_v1!(Baked);
    impl_property_name_long_east_asian_width_v1!(Baked);
    impl_property_name_long_general_category_v1!(Baked);
    impl_property_name_long_grapheme_cluster_break_v1!(Baked);
    impl_property_name_long_hangul_syllable_type_v1!(Baked);
    impl_property_name_long_indic_syllabic_category_v1!(Baked);
    impl_property_name_long_joining_type_v1!(Baked);
    impl_property_name_long_line_break_v1!(Baked);
    impl_property_name_long_script_v1!(Baked);
    impl_property_name_long_sentence_break_v1!(Baked);
    impl_property_name_long_vertical_orientation_v1!(Baked);
    impl_property_name_long_word_break_v1!(Baked);
    impl_property_name_parse_bidi_class_v1!(Baked);
    impl_property_name_parse_canonical_combining_class_v1!(Baked);
    impl_property_name_parse_east_asian_width_v1!(Baked);
    impl_property_name_parse_general_category_mask_v1!(Baked);
    impl_property_name_parse_general_category_v1!(Baked);
    impl_property_name_parse_grapheme_cluster_break_v1!(Baked);
    impl_property_name_parse_hangul_syllable_type_v1!(Baked);
    impl_property_name_parse_indic_syllabic_category_v1!(Baked);
    impl_property_name_parse_joining_type_v1!(Baked);
    impl_property_name_parse_line_break_v1!(Baked);
    impl_property_name_parse_script_v1!(Baked);
    impl_property_name_parse_sentence_break_v1!(Baked);
    impl_property_name_parse_vertical_orientation_v1!(Baked);
    impl_property_name_parse_word_break_v1!(Baked);
    impl_property_name_short_bidi_class_v1!(Baked);
    impl_property_name_short_canonical_combining_class_v1!(Baked);
    impl_property_name_short_east_asian_width_v1!(Baked);
    impl_property_name_short_general_category_v1!(Baked);
    impl_property_name_short_grapheme_cluster_break_v1!(Baked);
    impl_property_name_short_hangul_syllable_type_v1!(Baked);
    impl_property_name_short_indic_syllabic_category_v1!(Baked);
    impl_property_name_short_joining_type_v1!(Baked);
    impl_property_name_short_line_break_v1!(Baked);
    impl_property_name_short_script_v1!(Baked);
    impl_property_name_short_sentence_break_v1!(Baked);
    impl_property_name_short_vertical_orientation_v1!(Baked);
    impl_property_name_short_word_break_v1!(Baked);
    impl_property_script_with_extensions_v1!(Baked);
};

icu_provider::data_marker!(
    /// `PropertyBinaryAlnumV1`
    PropertyBinaryAlnumV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryAlphabeticV1`
    PropertyBinaryAlphabeticV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryAsciiHexDigitV1`
    PropertyBinaryAsciiHexDigitV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryBidiControlV1`
    PropertyBinaryBidiControlV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryBidiMirroredV1`
    PropertyBinaryBidiMirroredV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryBlankV1`
    PropertyBinaryBlankV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryCasedV1`
    PropertyBinaryCasedV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryCaseIgnorableV1`
    PropertyBinaryCaseIgnorableV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryCaseSensitiveV1`
    PropertyBinaryCaseSensitiveV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryChangesWhenCasefoldedV1`
    PropertyBinaryChangesWhenCasefoldedV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryChangesWhenCasemappedV1`
    PropertyBinaryChangesWhenCasemappedV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryChangesWhenLowercasedV1`
    PropertyBinaryChangesWhenLowercasedV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryChangesWhenNfkcCasefoldedV1`
    PropertyBinaryChangesWhenNfkcCasefoldedV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryChangesWhenTitlecasedV1`
    PropertyBinaryChangesWhenTitlecasedV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryChangesWhenUppercasedV1`
    PropertyBinaryChangesWhenUppercasedV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryDashV1`
    PropertyBinaryDashV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryDefaultIgnorableCodePointV1`
    PropertyBinaryDefaultIgnorableCodePointV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryDeprecatedV1`
    PropertyBinaryDeprecatedV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryDiacriticV1`
    PropertyBinaryDiacriticV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryEmojiComponentV1`
    PropertyBinaryEmojiComponentV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryEmojiModifierBaseV1`
    PropertyBinaryEmojiModifierBaseV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryEmojiModifierV1`
    PropertyBinaryEmojiModifierV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryEmojiPresentationV1`
    PropertyBinaryEmojiPresentationV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryEmojiV1`
    PropertyBinaryEmojiV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryExtendedPictographicV1`
    PropertyBinaryExtendedPictographicV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryExtenderV1`
    PropertyBinaryExtenderV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryFullCompositionExclusionV1`
    PropertyBinaryFullCompositionExclusionV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryGraphemeBaseV1`
    PropertyBinaryGraphemeBaseV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryGraphemeExtendV1`
    PropertyBinaryGraphemeExtendV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryGraphemeLinkV1`
    PropertyBinaryGraphemeLinkV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryGraphV1`
    PropertyBinaryGraphV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryHexDigitV1`
    PropertyBinaryHexDigitV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryHyphenV1`
    PropertyBinaryHyphenV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryIdContinueV1`
    PropertyBinaryIdContinueV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryIdeographicV1`
    PropertyBinaryIdeographicV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryIdsBinaryOperatorV1`
    PropertyBinaryIdsBinaryOperatorV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryIdStartV1`
    PropertyBinaryIdStartV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryIdsTrinaryOperatorV1`
    PropertyBinaryIdsTrinaryOperatorV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryJoinControlV1`
    PropertyBinaryJoinControlV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryLogicalOrderExceptionV1`
    PropertyBinaryLogicalOrderExceptionV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryLowercaseV1`
    PropertyBinaryLowercaseV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryMathV1`
    PropertyBinaryMathV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryNfcInertV1`
    PropertyBinaryNfcInertV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryNfdInertV1`
    PropertyBinaryNfdInertV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryNfkcInertV1`
    PropertyBinaryNfkcInertV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryNfkdInertV1`
    PropertyBinaryNfkdInertV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryNoncharacterCodePointV1`
    PropertyBinaryNoncharacterCodePointV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryPatternSyntaxV1`
    PropertyBinaryPatternSyntaxV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryPatternWhiteSpaceV1`
    PropertyBinaryPatternWhiteSpaceV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryPrependedConcatenationMarkV1`
    PropertyBinaryPrependedConcatenationMarkV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryPrintV1`
    PropertyBinaryPrintV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryQuotationMarkV1`
    PropertyBinaryQuotationMarkV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryRadicalV1`
    PropertyBinaryRadicalV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryRegionalIndicatorV1`
    PropertyBinaryRegionalIndicatorV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinarySegmentStarterV1`
    PropertyBinarySegmentStarterV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinarySentenceTerminalV1`
    PropertyBinarySentenceTerminalV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinarySoftDottedV1`
    PropertyBinarySoftDottedV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryTerminalPunctuationV1`
    PropertyBinaryTerminalPunctuationV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryUnifiedIdeographV1`
    PropertyBinaryUnifiedIdeographV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryUppercaseV1`
    PropertyBinaryUppercaseV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryVariationSelectorV1`
    PropertyBinaryVariationSelectorV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryWhiteSpaceV1`
    PropertyBinaryWhiteSpaceV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryXdigitV1`
    PropertyBinaryXdigitV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryXidContinueV1`
    PropertyBinaryXidContinueV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyBinaryXidStartV1`
    PropertyBinaryXidStartV1,
    PropertyCodePointSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// Data marker for the 'BidiClass' Unicode property
    PropertyEnumBidiClassV1,
    PropertyCodePointMap<'static, crate::props::BidiClass>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'CanonicalCombiningClass' Unicode property
    PropertyEnumCanonicalCombiningClassV1,
    PropertyCodePointMap<'static, crate::props::CanonicalCombiningClass>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'EastAsianWidth' Unicode property
    PropertyEnumEastAsianWidthV1,
    PropertyCodePointMap<'static, crate::props::EastAsianWidth>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'GeneralCategory' Unicode property
    PropertyEnumGeneralCategoryV1,
    PropertyCodePointMap<'static, crate::props::GeneralCategory>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'GraphemeClusterBreak' Unicode property
    PropertyEnumGraphemeClusterBreakV1,
    PropertyCodePointMap<'static, crate::props::GraphemeClusterBreak>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'HangulSyllableType' Unicode property
    PropertyEnumHangulSyllableTypeV1,
    PropertyCodePointMap<'static, crate::props::HangulSyllableType>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'IndicConjunctBreak' Unicode property
    PropertyEnumIndicConjunctBreakV1,
    PropertyCodePointMap<'static, crate::props::IndicConjunctBreak>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'IndicSyllabicCategory' Unicode property
    PropertyEnumIndicSyllabicCategoryV1,
    PropertyCodePointMap<'static, crate::props::IndicSyllabicCategory>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'JoiningType' Unicode property
    PropertyEnumJoiningTypeV1,
    PropertyCodePointMap<'static, crate::props::JoiningType>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'LineBreak' Unicode property
    PropertyEnumLineBreakV1,
    PropertyCodePointMap<'static, crate::props::LineBreak>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'Script' Unicode property
    PropertyEnumScriptV1,
    PropertyCodePointMap<'static, crate::props::Script>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'SentenceBreak' Unicode property
    PropertyEnumSentenceBreakV1,
    PropertyCodePointMap<'static, crate::props::SentenceBreak>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'Vertical_Orientation' Unicode property
    PropertyEnumVerticalOrientationV1,
    PropertyCodePointMap<'static, crate::props::VerticalOrientation>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'WordBreak' Unicode property
    PropertyEnumWordBreakV1,
    PropertyCodePointMap<'static, crate::props::WordBreak>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// Data marker for the 'BidiMirroringGlyph' Unicode property
    PropertyEnumBidiMirroringGlyphV1,
    PropertyCodePointMap<'static, crate::bidi::BidiMirroringGlyph>,
    is_singleton = true,
);
icu_provider::data_marker!(
    /// `PropertyBinaryBasicEmojiV1`
    PropertyBinaryBasicEmojiV1,
    PropertyUnicodeSet<'static>,
    is_singleton = true
);
icu_provider::data_marker!(
    /// `PropertyScriptWithExtensionsV1`
    PropertyScriptWithExtensionsV1,
    ScriptWithExtensionsProperty<'static>,
    is_singleton = true
);

/// All data keys in this module.
pub const MARKERS: &[DataMarkerInfo] = &[
    PropertyNameLongBidiClassV1::INFO,
    PropertyNameLongCanonicalCombiningClassV1::INFO,
    PropertyNameLongEastAsianWidthV1::INFO,
    PropertyNameLongGeneralCategoryV1::INFO,
    PropertyNameLongGraphemeClusterBreakV1::INFO,
    PropertyNameLongHangulSyllableTypeV1::INFO,
    PropertyNameLongIndicSyllabicCategoryV1::INFO,
    PropertyNameLongJoiningTypeV1::INFO,
    PropertyNameLongLineBreakV1::INFO,
    PropertyNameLongScriptV1::INFO,
    PropertyNameLongSentenceBreakV1::INFO,
    PropertyNameLongVerticalOrientationV1::INFO,
    PropertyNameLongWordBreakV1::INFO,
    PropertyNameParseBidiClassV1::INFO,
    PropertyNameParseCanonicalCombiningClassV1::INFO,
    PropertyNameParseEastAsianWidthV1::INFO,
    PropertyNameParseGeneralCategoryMaskV1::INFO,
    PropertyNameParseGeneralCategoryV1::INFO,
    PropertyNameParseGraphemeClusterBreakV1::INFO,
    PropertyNameParseHangulSyllableTypeV1::INFO,
    PropertyNameParseIndicSyllabicCategoryV1::INFO,
    PropertyNameParseJoiningTypeV1::INFO,
    PropertyNameParseLineBreakV1::INFO,
    PropertyNameParseScriptV1::INFO,
    PropertyNameParseSentenceBreakV1::INFO,
    PropertyNameParseVerticalOrientationV1::INFO,
    PropertyNameParseWordBreakV1::INFO,
    PropertyNameShortBidiClassV1::INFO,
    PropertyNameShortCanonicalCombiningClassV1::INFO,
    PropertyNameShortEastAsianWidthV1::INFO,
    PropertyNameShortGeneralCategoryV1::INFO,
    PropertyNameShortGraphemeClusterBreakV1::INFO,
    PropertyNameShortHangulSyllableTypeV1::INFO,
    PropertyNameShortIndicSyllabicCategoryV1::INFO,
    PropertyNameShortJoiningTypeV1::INFO,
    PropertyNameShortLineBreakV1::INFO,
    PropertyNameShortScriptV1::INFO,
    PropertyNameShortSentenceBreakV1::INFO,
    PropertyNameShortVerticalOrientationV1::INFO,
    PropertyNameShortWordBreakV1::INFO,
    PropertyBinaryAlnumV1::INFO,
    PropertyBinaryAlphabeticV1::INFO,
    PropertyBinaryAsciiHexDigitV1::INFO,
    PropertyBinaryBidiControlV1::INFO,
    PropertyBinaryBidiMirroredV1::INFO,
    PropertyBinaryBlankV1::INFO,
    PropertyBinaryCasedV1::INFO,
    PropertyBinaryCaseIgnorableV1::INFO,
    PropertyBinaryCaseSensitiveV1::INFO,
    PropertyBinaryChangesWhenCasefoldedV1::INFO,
    PropertyBinaryChangesWhenCasemappedV1::INFO,
    PropertyBinaryChangesWhenLowercasedV1::INFO,
    PropertyBinaryChangesWhenNfkcCasefoldedV1::INFO,
    PropertyBinaryChangesWhenTitlecasedV1::INFO,
    PropertyBinaryChangesWhenUppercasedV1::INFO,
    PropertyBinaryDashV1::INFO,
    PropertyBinaryDefaultIgnorableCodePointV1::INFO,
    PropertyBinaryDeprecatedV1::INFO,
    PropertyBinaryDiacriticV1::INFO,
    PropertyBinaryEmojiComponentV1::INFO,
    PropertyBinaryEmojiModifierBaseV1::INFO,
    PropertyBinaryEmojiModifierV1::INFO,
    PropertyBinaryEmojiPresentationV1::INFO,
    PropertyBinaryEmojiV1::INFO,
    PropertyBinaryExtendedPictographicV1::INFO,
    PropertyBinaryExtenderV1::INFO,
    PropertyBinaryFullCompositionExclusionV1::INFO,
    PropertyBinaryGraphemeBaseV1::INFO,
    PropertyBinaryGraphemeExtendV1::INFO,
    PropertyBinaryGraphemeLinkV1::INFO,
    PropertyBinaryGraphV1::INFO,
    PropertyBinaryHexDigitV1::INFO,
    PropertyBinaryHyphenV1::INFO,
    PropertyBinaryIdContinueV1::INFO,
    PropertyBinaryIdeographicV1::INFO,
    PropertyBinaryIdsBinaryOperatorV1::INFO,
    PropertyBinaryIdStartV1::INFO,
    PropertyBinaryIdsTrinaryOperatorV1::INFO,
    PropertyBinaryJoinControlV1::INFO,
    PropertyBinaryLogicalOrderExceptionV1::INFO,
    PropertyBinaryLowercaseV1::INFO,
    PropertyBinaryMathV1::INFO,
    PropertyBinaryNfcInertV1::INFO,
    PropertyBinaryNfdInertV1::INFO,
    PropertyBinaryNfkcInertV1::INFO,
    PropertyBinaryNfkdInertV1::INFO,
    PropertyBinaryNoncharacterCodePointV1::INFO,
    PropertyBinaryPatternSyntaxV1::INFO,
    PropertyBinaryPatternWhiteSpaceV1::INFO,
    PropertyBinaryPrependedConcatenationMarkV1::INFO,
    PropertyBinaryPrintV1::INFO,
    PropertyBinaryQuotationMarkV1::INFO,
    PropertyBinaryRadicalV1::INFO,
    PropertyBinaryRegionalIndicatorV1::INFO,
    PropertyBinarySegmentStarterV1::INFO,
    PropertyBinarySentenceTerminalV1::INFO,
    PropertyBinarySoftDottedV1::INFO,
    PropertyBinaryTerminalPunctuationV1::INFO,
    PropertyBinaryUnifiedIdeographV1::INFO,
    PropertyBinaryUppercaseV1::INFO,
    PropertyBinaryVariationSelectorV1::INFO,
    PropertyBinaryWhiteSpaceV1::INFO,
    PropertyBinaryXdigitV1::INFO,
    PropertyBinaryXidContinueV1::INFO,
    PropertyBinaryXidStartV1::INFO,
    PropertyEnumBidiClassV1::INFO,
    PropertyEnumCanonicalCombiningClassV1::INFO,
    PropertyEnumEastAsianWidthV1::INFO,
    PropertyEnumGeneralCategoryV1::INFO,
    PropertyEnumGraphemeClusterBreakV1::INFO,
    PropertyEnumHangulSyllableTypeV1::INFO,
    PropertyEnumIndicConjunctBreakV1::INFO,
    PropertyEnumIndicSyllabicCategoryV1::INFO,
    PropertyEnumJoiningTypeV1::INFO,
    PropertyEnumLineBreakV1::INFO,
    PropertyEnumScriptV1::INFO,
    PropertyEnumSentenceBreakV1::INFO,
    PropertyEnumVerticalOrientationV1::INFO,
    PropertyEnumWordBreakV1::INFO,
    PropertyEnumBidiMirroringGlyphV1::INFO,
    PropertyBinaryBasicEmojiV1::INFO,
    PropertyScriptWithExtensionsV1::INFO,
];

/// A set of characters which share a particular property value.
///
/// This data enum is extensible, more backends may be added in the future.
/// Old data can be used with newer code but not vice versa.
///
/// <div class="stab unstable">
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
/// to be stable, their Rust representation might not be. Use with caution.
/// </div>
#[derive(Debug, Eq, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
#[cfg_attr(feature = "datagen", databake(path = icu_properties::provider))]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[non_exhaustive]
pub enum PropertyCodePointSet<'data> {
    /// The set of characters, represented as an inversion list
    InversionList(#[cfg_attr(feature = "serde", serde(borrow))] CodePointInversionList<'data>),
    // new variants should go BELOW existing ones
    // Serde serializes based on variant name and index in the enum
    // https://docs.rs/serde/latest/serde/trait.Serializer.html#tymethod.serialize_unit_variant
}

icu_provider::data_struct!(
    PropertyCodePointSet<'_>,
    #[cfg(feature = "datagen")]
);

// See CodePointSetData for documentation of these functions
impl<'data> PropertyCodePointSet<'data> {
    #[inline]
    pub(crate) fn contains(&self, ch: char) -> bool {
        match *self {
            Self::InversionList(ref l) => l.contains(ch),
        }
    }

    #[inline]
    pub(crate) fn contains32(&self, ch: u32) -> bool {
        match *self {
            Self::InversionList(ref l) => l.contains32(ch),
        }
    }

    #[inline]
    pub(crate) fn iter_ranges(&self) -> impl Iterator<Item = RangeInclusive<u32>> + '_ {
        match *self {
            Self::InversionList(ref l) => l.iter_ranges(),
        }
    }

    #[inline]
    pub(crate) fn iter_ranges_complemented(
        &self,
    ) -> impl Iterator<Item = RangeInclusive<u32>> + '_ {
        match *self {
            Self::InversionList(ref l) => l.iter_ranges_complemented(),
        }
    }

    #[inline]
    pub(crate) fn from_code_point_inversion_list(l: CodePointInversionList<'static>) -> Self {
        Self::InversionList(l)
    }

    #[inline]
    pub(crate) fn as_code_point_inversion_list(
        &'_ self,
    ) -> Option<&'_ CodePointInversionList<'data>> {
        match *self {
            Self::InversionList(ref l) => Some(l),
            // any other backing data structure that cannot return a CPInvList in O(1) time should return None
        }
    }

    #[inline]
    pub(crate) fn to_code_point_inversion_list(&self) -> CodePointInversionList<'_> {
        match *self {
            Self::InversionList(ref t) => ZeroFrom::zero_from(t),
        }
    }
}

/// A map efficiently storing data about individual characters.
///
/// This data enum is extensible, more backends may be added in the future.
/// Old data can be used with newer code but not vice versa.
///
/// <div class="stab unstable">
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
/// to be stable, their Rust representation might not be. Use with caution.
/// </div>
#[derive(Clone, Debug, Eq, PartialEq, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
#[cfg_attr(feature = "datagen", databake(path = icu_properties::provider))]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[non_exhaustive]
pub enum PropertyCodePointMap<'data, T: TrieValue> {
    /// A codepoint trie storing the data
    CodePointTrie(#[cfg_attr(feature = "serde", serde(borrow))] CodePointTrie<'data, T>),
    // new variants should go BELOW existing ones
    // Serde serializes based on variant name and index in the enum
    // https://docs.rs/serde/latest/serde/trait.Serializer.html#tymethod.serialize_unit_variant
}

icu_provider::data_struct!(
    <T: TrieValue> PropertyCodePointMap<'_, T>,
    #[cfg(feature = "datagen")]
);

// See CodePointMapData for documentation of these functions
impl<'data, T: TrieValue> PropertyCodePointMap<'data, T> {
    #[inline]
    pub(crate) fn get32(&self, ch: u32) -> T {
        match *self {
            Self::CodePointTrie(ref t) => t.get32(ch),
        }
    }

    #[inline]
    #[cfg(feature = "alloc")]
    pub(crate) fn try_into_converted<P>(
        self,
    ) -> Result<PropertyCodePointMap<'data, P>, zerovec::ule::UleError>
    where
        P: TrieValue,
    {
        match self {
            Self::CodePointTrie(t) => t
                .try_into_converted()
                .map(PropertyCodePointMap::CodePointTrie),
        }
    }

    #[inline]
    #[cfg(feature = "alloc")]
    pub(crate) fn get_set_for_value(&self, value: T) -> CodePointInversionList<'static> {
        match *self {
            Self::CodePointTrie(ref t) => t.get_set_for_value(value),
        }
    }

    #[inline]
    pub(crate) fn iter_ranges(&self) -> impl Iterator<Item = CodePointMapRange<T>> + '_ {
        match *self {
            Self::CodePointTrie(ref t) => t.iter_ranges(),
        }
    }
    #[inline]
    pub(crate) fn iter_ranges_mapped<'a, U: Eq + 'a>(
        &'a self,
        map: impl FnMut(T) -> U + Copy + 'a,
    ) -> impl Iterator<Item = CodePointMapRange<U>> + 'a {
        match *self {
            Self::CodePointTrie(ref t) => t.iter_ranges_mapped(map),
        }
    }

    #[inline]
    pub(crate) fn from_code_point_trie(trie: CodePointTrie<'static, T>) -> Self {
        Self::CodePointTrie(trie)
    }

    #[inline]
    pub(crate) fn as_code_point_trie(&self) -> Option<&CodePointTrie<'data, T>> {
        match *self {
            Self::CodePointTrie(ref t) => Some(t),
            // any other backing data structure that cannot return a CPT in O(1) time should return None
        }
    }

    #[inline]
    pub(crate) fn to_code_point_trie(&self) -> CodePointTrie<'_, T> {
        match *self {
            Self::CodePointTrie(ref t) => ZeroFrom::zero_from(t),
        }
    }
}

/// A set of characters and strings which share a particular property value.
///
/// <div class="stab unstable">
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
/// to be stable, their Rust representation might not be. Use with caution.
/// </div>
#[derive(Debug, Eq, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
#[cfg_attr(feature = "datagen", databake(path = icu_properties::provider))]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[non_exhaustive]
pub enum PropertyUnicodeSet<'data> {
    /// A set representing characters in an inversion list, and the strings in a list.
    CPInversionListStrList(
        #[cfg_attr(feature = "serde", serde(borrow))] CodePointInversionListAndStringList<'data>,
    ),
    // new variants should go BELOW existing ones
    // Serde serializes based on variant name and index in the enum
    // https://docs.rs/serde/latest/serde/trait.Serializer.html#tymethod.serialize_unit_variant
}

icu_provider::data_struct!(
    PropertyUnicodeSet<'_>,
    #[cfg(feature = "datagen")]
);

impl<'data> PropertyUnicodeSet<'data> {
    #[inline]
    pub(crate) fn contains_str(&self, s: &str) -> bool {
        match *self {
            Self::CPInversionListStrList(ref l) => l.contains_str(s),
        }
    }

    #[inline]
    pub(crate) fn contains32(&self, cp: u32) -> bool {
        match *self {
            Self::CPInversionListStrList(ref l) => l.contains32(cp),
        }
    }

    #[inline]
    pub(crate) fn contains(&self, ch: char) -> bool {
        match *self {
            Self::CPInversionListStrList(ref l) => l.contains(ch),
        }
    }

    #[inline]
    pub(crate) fn from_code_point_inversion_list_string_list(
        l: CodePointInversionListAndStringList<'static>,
    ) -> Self {
        Self::CPInversionListStrList(l)
    }

    #[inline]
    pub(crate) fn as_code_point_inversion_list_string_list(
        &'_ self,
    ) -> Option<&'_ CodePointInversionListAndStringList<'data>> {
        match *self {
            Self::CPInversionListStrList(ref l) => Some(l),
            // any other backing data structure that cannot return a CPInversionListStrList in O(1) time should return None
        }
    }

    #[inline]
    pub(crate) fn to_code_point_inversion_list_string_list(
        &self,
    ) -> CodePointInversionListAndStringList<'_> {
        match *self {
            Self::CPInversionListStrList(ref t) => ZeroFrom::zero_from(t),
        }
    }
}

/// A struct that efficiently stores `Script` and `Script_Extensions` property data.
///
/// <div class="stab unstable">
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
/// to be stable, their Rust representation might not be. Use with caution.
/// </div>
#[derive(Debug, Eq, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
#[cfg_attr(feature = "datagen", databake(path = icu_properties::provider))]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
pub struct ScriptWithExtensionsProperty<'data> {
    /// Note: The `ScriptWithExt` values in this array will assume a 12-bit layout. The 2
    /// higher order bits 11..10 will indicate how to deduce the Script value and
    /// Script_Extensions value, nearly matching the representation
    /// [in ICU](https://github.com/unicode-org/icu/blob/main/icu4c/source/common/uprops.h):
    ///
    /// | High order 2 bits value | Script                                                 | Script_Extensions                                              |
    /// |-------------------------|--------------------------------------------------------|----------------------------------------------------------------|
    /// | 3                       | First value in sub-array, index given by lower 10 bits | Sub-array excluding first value, index given by lower 10 bits  |
    /// | 2                       | Script=Inherited                                       | Entire sub-array, index given by lower 10 bits                 |
    /// | 1                       | Script=Common                                          | Entire sub-array, index given by lower 10 bits                 |
    /// | 0                       | Value in lower 10 bits                                 | `[ Script value ]` single-element array                        |
    ///
    /// When the lower 10 bits of the value are used as an index, that index is
    /// used for the outer-level vector of the nested `extensions` structure.
    #[cfg_attr(feature = "serde", serde(borrow))]
    pub trie: CodePointTrie<'data, ScriptWithExt>,

    /// This companion structure stores Script_Extensions values, which are
    /// themselves arrays / vectors. This structure only stores the values for
    /// cases in which `scx(cp) != [ sc(cp) ]`. Each sub-vector is distinct. The
    /// sub-vector represents the Script_Extensions array value for a code point,
    /// and may also indicate Script value, as described for the `trie` field.
    #[cfg_attr(feature = "serde", serde(borrow))]
    pub extensions: VarZeroVec<'data, ZeroSlice<Script>>,
}

icu_provider::data_struct!(
    ScriptWithExtensionsProperty<'_>,
    #[cfg(feature = "datagen")]
);
