| // 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 ). |
| |
| //! Options for building and reading from a ZeroTrie. |
| //! |
| //! These options are internal to the crate. A small selection of options |
| //! are exported by way of the different public types on this crate. |
| |
| /// Whether to use the perfect hash function in the ZeroTrie. |
| #[derive(Copy, Clone)] |
| pub(crate) enum PhfMode { |
| /// Use binary search for all branch nodes. |
| BinaryOnly, |
| /// Use the perfect hash function for large branch nodes. |
| UsePhf, |
| } |
| |
| impl PhfMode { |
| #[cfg(feature = "serde")] |
| const fn to_u8_flag(self) -> u8 { |
| match self { |
| Self::BinaryOnly => 0, |
| Self::UsePhf => 0x1, |
| } |
| } |
| } |
| |
| /// Whether to support non-ASCII data in the ZeroTrie. |
| #[derive(Copy, Clone)] |
| pub(crate) enum AsciiMode { |
| /// Support only ASCII, returning an error if non-ASCII is found. |
| AsciiOnly, |
| /// Support all data, creating span nodes for non-ASCII bytes. |
| BinarySpans, |
| } |
| |
| impl AsciiMode { |
| #[cfg(feature = "serde")] |
| const fn to_u8_flag(self) -> u8 { |
| match self { |
| Self::AsciiOnly => 0, |
| Self::BinarySpans => 0x2, |
| } |
| } |
| } |
| |
| /// Whether to enforce a limit to the capacity of the ZeroTrie. |
| #[derive(Copy, Clone)] |
| pub(crate) enum CapacityMode { |
| /// Return an error if the trie requires a branch of more than 2^32 bytes. |
| Normal, |
| /// Construct the trie without returning an error. |
| Extended, |
| } |
| |
| impl CapacityMode { |
| #[cfg(feature = "serde")] |
| const fn to_u8_flag(self) -> u8 { |
| match self { |
| Self::Normal => 0, |
| Self::Extended => 0x4, |
| } |
| } |
| } |
| |
| /// How to handle strings with mixed ASCII case at a node, such as "abc" and "Abc" |
| #[derive(Copy, Clone)] |
| pub(crate) enum CaseSensitivity { |
| /// Allow all strings and sort them by byte value. |
| Sensitive, |
| /// Reject strings with different case and sort them as if `to_ascii_lowercase` is called. |
| IgnoreCase, |
| } |
| |
| impl CaseSensitivity { |
| #[cfg(feature = "serde")] |
| const fn to_u8_flag(self) -> u8 { |
| match self { |
| Self::Sensitive => 0, |
| Self::IgnoreCase => 0x8, |
| } |
| } |
| } |
| |
| #[derive(Copy, Clone)] |
| pub(crate) struct ZeroTrieBuilderOptions { |
| pub phf_mode: PhfMode, |
| pub ascii_mode: AsciiMode, |
| pub capacity_mode: CapacityMode, |
| pub case_sensitivity: CaseSensitivity, |
| } |
| |
| impl ZeroTrieBuilderOptions { |
| #[cfg(feature = "serde")] |
| pub(crate) const fn to_u8_flags(self) -> u8 { |
| self.phf_mode.to_u8_flag() |
| | self.ascii_mode.to_u8_flag() |
| | self.capacity_mode.to_u8_flag() |
| | self.case_sensitivity.to_u8_flag() |
| } |
| } |
| |
| pub(crate) trait ZeroTrieWithOptions { |
| const OPTIONS: ZeroTrieBuilderOptions; |
| } |
| |
| /// All branch nodes are binary search |
| /// and there are no span nodes. |
| impl<S: ?Sized> ZeroTrieWithOptions for crate::ZeroTrieSimpleAscii<S> { |
| const OPTIONS: ZeroTrieBuilderOptions = ZeroTrieBuilderOptions { |
| phf_mode: PhfMode::BinaryOnly, |
| ascii_mode: AsciiMode::AsciiOnly, |
| capacity_mode: CapacityMode::Normal, |
| case_sensitivity: CaseSensitivity::Sensitive, |
| }; |
| } |
| |
| impl<S: ?Sized> crate::ZeroTrieSimpleAscii<S> { |
| #[cfg(feature = "serde")] |
| pub(crate) const FLAGS: u8 = Self::OPTIONS.to_u8_flags(); |
| } |
| |
| /// All branch nodes are binary search |
| /// and nodes use case-insensitive matching. |
| impl<S: ?Sized> ZeroTrieWithOptions for crate::ZeroAsciiIgnoreCaseTrie<S> { |
| const OPTIONS: ZeroTrieBuilderOptions = ZeroTrieBuilderOptions { |
| phf_mode: PhfMode::BinaryOnly, |
| ascii_mode: AsciiMode::AsciiOnly, |
| capacity_mode: CapacityMode::Normal, |
| case_sensitivity: CaseSensitivity::IgnoreCase, |
| }; |
| } |
| |
| /// Branch nodes could be either binary search or PHF. |
| impl<S: ?Sized> ZeroTrieWithOptions for crate::ZeroTriePerfectHash<S> { |
| const OPTIONS: ZeroTrieBuilderOptions = ZeroTrieBuilderOptions { |
| phf_mode: PhfMode::UsePhf, |
| ascii_mode: AsciiMode::BinarySpans, |
| capacity_mode: CapacityMode::Normal, |
| case_sensitivity: CaseSensitivity::Sensitive, |
| }; |
| } |
| |
| /// No limited capacity assertion. |
| impl<S: ?Sized> ZeroTrieWithOptions for crate::ZeroTrieExtendedCapacity<S> { |
| const OPTIONS: ZeroTrieBuilderOptions = ZeroTrieBuilderOptions { |
| phf_mode: PhfMode::UsePhf, |
| ascii_mode: AsciiMode::BinarySpans, |
| capacity_mode: CapacityMode::Extended, |
| case_sensitivity: CaseSensitivity::Sensitive, |
| }; |
| } |