use super::ComplexScript;
use icu_collections::codepointtrie::CodePointTrie;
use icu_provider::prelude::*;
use zerovec::ZeroVec;
icu_provider::data_marker!(
SegmenterBreakLineV2,
"segmenter/break/line/v2",
SegmenterStateMachine<'static>,
is_singleton = true,
#[cfg(feature = "datagen")]
has_checksum = true,
);
icu_provider::data_marker!(
SegmenterBreakWordV2,
"segmenter/break/word/v2",
SegmenterStateMachine<'static>,
is_singleton = true,
#[cfg(feature = "datagen")]
has_checksum = true,
);
icu_provider::data_marker!(
SegmenterBreakGraphemeClusterV2,
"segmenter/break/grapheme/cluster/v2",
SegmenterStateMachine<'static>,
is_singleton = true,
#[cfg(feature = "datagen")]
has_checksum = true,
);
icu_provider::data_marker!(
SegmenterBreakSentenceV2,
"segmenter/break/sentence/v2",
SegmenterStateMachine<'static>,
is_singleton = true,
#[cfg(feature = "datagen")]
has_checksum = true,
);
icu_provider::data_marker!(
SegmenterBreakLineOverrideV2,
"segmenter/break/line/override/v2",
SegmenterStateMachineOverride<'static>,
#[cfg(feature = "datagen")]
expose_baked_consts = true,
has_checksum = true,
);
icu_provider::data_marker!(
SegmenterBreakSentenceOverrideV2,
"segmenter/break/sentence/override/v2",
SegmenterStateMachineOverride<'static>,
#[cfg(feature = "datagen")]
has_checksum = true,
);
pub type State = u8;
pub type Symbol = u8;
pub type Lookahead = u8;
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
#[cfg_attr(feature = "datagen", databake(path = icu_segmenter::provider))]
pub enum Acceptance {
Continue,
Accept(u8),
Conditional(Lookahead, u8),
}
impl zerovec::ule::AsULE for Acceptance {
type ULE = u8;
fn to_unaligned(self) -> Self::ULE {
match self {
Self::Continue => 0b11111 << 3 | 0b111,
Self::Accept(status) => 0b11111 << 3 | (status & 0b111),
Self::Conditional(n, status) => n << 3 | (status & 0b111),
}
}
fn from_unaligned(unaligned: Self::ULE) -> Self {
match (unaligned >> 3, unaligned & 0b111) {
(0b11111, 0b111) => Self::Continue,
(0b11111, status) => Self::Accept(status),
(n, status) => Self::Conditional(n, status),
}
}
}
#[derive(Debug, yoke::Yokeable, PartialEq, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake))]
#[cfg_attr(feature = "datagen", databake(path = icu_segmenter::provider))]
pub struct SegmenterStateMachine<'data> {
#[cfg_attr(feature = "serde", serde(borrow))]
pub symbols: CodePointTrie<'data, Symbol>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub states: ZeroVec<'data, (Acceptance, Option<Lookahead>)>,
#[cfg_attr(feature = "serde", serde(borrow))]
pub transitions: ZeroVec<'data, State>,
pub num_lookaheads: usize,
pub pseudo_symbol_shift: u8,
#[cfg_attr(feature = "serde", serde(borrow))]
pub pseudo_symbol_map: ZeroVec<'data, (Symbol, ComplexScript)>,
}
icu_provider::data_struct!(
SegmenterStateMachine<'_>,
#[cfg(feature = "datagen")]
);
impl SegmenterStateMachine<'_> {
pub const START_STATE: State = 0;
pub const TRASH_STATE: State = State::MAX;
pub const EOT_SYMBOL: Symbol = 0;
}
#[derive(Debug, PartialEq, Clone, yoke::Yokeable, zerofrom::ZeroFrom)]
#[cfg_attr(
feature = "datagen",
derive(serde::Serialize,databake::Bake),
databake(path = icu_segmenter::provider),
)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
pub struct SegmenterStateMachineOverride<'data> {
#[cfg_attr(feature = "serde", serde(borrow))]
pub pseudo_symbol_map: ZeroVec<'data, (Symbol, ComplexScript)>,
}
icu_provider::data_struct!(
SegmenterStateMachineOverride<'_>,
#[cfg(feature = "datagen")]
);