#![no_std]
#![warn(missing_docs)]
extern crate alloc;
#[cfg(feature = "std")]
extern crate std;
use alloc::borrow::Cow;
pub mod casefold;
mod ccc;
mod compose;
pub mod confusable;
mod decompose;
mod hangul;
pub mod matching;
pub mod normalizer;
mod quick_check;
#[cfg(not(any(test, feature = "internal-test-api")))]
pub(crate) mod simd;
#[cfg(any(test, feature = "internal-test-api"))]
#[doc(hidden)]
pub mod simd;
mod tables;
mod utf8;
#[cfg(any(test, feature = "internal-test-api"))]
pub mod tables_ext;
#[cfg(any(test, feature = "internal-test-api"))]
#[allow(rustdoc::private_intra_doc_links)]
pub mod simd_test_api {
#[inline]
pub unsafe fn scan_chunk(ptr: *const u8, bound: u8) -> u64 {
unsafe { crate::simd::scan_chunk(ptr, bound) }
}
#[cfg(target_arch = "aarch64")]
#[inline]
pub unsafe fn neon_scan_chunk(ptr: *const u8, bound: u8) -> u64 {
unsafe { crate::simd::aarch64::neon::scan_chunk(ptr, bound) }
}
#[cfg(target_arch = "aarch64")]
#[inline]
pub unsafe fn sve2_scan_chunk(ptr: *const u8, bound: u8) -> u64 {
unsafe { crate::simd::aarch64::sve2::scan_chunk(ptr, bound) }
}
}
pub use casefold::{CaseFoldMode, casefold, casefold_char};
pub use confusable::{are_confusable, skeleton};
#[cfg(any(test, feature = "internal-test-api"))]
pub use matching::normalize_for_matching_legacy;
pub use matching::{
MatchingOptions, matches_normalized, normalize_for_matching, normalize_for_matching_utf16,
};
pub use normalizer::{NfcNormalizer, NfdNormalizer, NfkcNormalizer, NfkdNormalizer};
pub use quick_check::IsNormalized;
#[cfg(feature = "quick_check_oracle")]
pub use crate::quick_check::{
quick_check_nfc, quick_check_nfc_oracle, quick_check_nfd, quick_check_nfd_oracle,
quick_check_nfkc, quick_check_nfkc_oracle, quick_check_nfkd, quick_check_nfkd_oracle,
};
#[inline]
pub fn nfc() -> NfcNormalizer {
NfcNormalizer::new()
}
#[inline]
pub fn nfd() -> NfdNormalizer {
NfdNormalizer::new()
}
#[inline]
pub fn nfkc() -> NfkcNormalizer {
NfkcNormalizer::new()
}
#[inline]
pub fn nfkd() -> NfkdNormalizer {
NfkdNormalizer::new()
}
pub trait UnicodeNormalization {
fn nfc(&self) -> Cow<'_, str>;
fn nfd(&self) -> Cow<'_, str>;
fn nfkc(&self) -> Cow<'_, str>;
fn nfkd(&self) -> Cow<'_, str>;
fn is_nfc(&self) -> bool;
fn is_nfd(&self) -> bool;
fn is_nfkc(&self) -> bool;
fn is_nfkd(&self) -> bool;
}
impl UnicodeNormalization for str {
#[inline]
fn nfc(&self) -> Cow<'_, str> {
crate::nfc().normalize(self)
}
#[inline]
fn nfd(&self) -> Cow<'_, str> {
crate::nfd().normalize(self)
}
#[inline]
fn nfkc(&self) -> Cow<'_, str> {
crate::nfkc().normalize(self)
}
#[inline]
fn nfkd(&self) -> Cow<'_, str> {
crate::nfkd().normalize(self)
}
#[inline]
fn is_nfc(&self) -> bool {
crate::nfc().is_normalized(self)
}
#[inline]
fn is_nfd(&self) -> bool {
crate::nfd().is_normalized(self)
}
#[inline]
fn is_nfkc(&self) -> bool {
crate::nfkc().is_normalized(self)
}
#[inline]
fn is_nfkd(&self) -> bool {
crate::nfkd().is_normalized(self)
}
}