use core::cmp;
use unic_char_property::{CharProperty, CustomCharProperty, PartialCharProperty};
pub use unic_ucd_version::UnicodeVersion;
#[derive(Clone, Copy, Eq, PartialEq, Ord, Debug, Hash)]
pub struct Age(UnicodeVersion);
impl CharProperty for Age {
fn prop_abbr_name() -> &'static str {
"age"
}
fn prop_long_name() -> &'static str {
"Age"
}
fn prop_human_name() -> &'static str {
"Age"
}
}
impl PartialCharProperty for Age {
fn of(ch: char) -> Option<Self> {
Self::of(ch)
}
}
impl CustomCharProperty<UnicodeVersion> for Age {
fn actual(&self) -> UnicodeVersion {
Self::actual(self)
}
}
mod data {
use super::UnicodeVersion;
use unic_char_property::tables::CharDataTable;
pub const AGE_TABLE: CharDataTable<UnicodeVersion> = include!("../tables/age_values.rsv");
}
impl Age {
pub fn of(ch: char) -> Option<Age> {
data::AGE_TABLE.find(ch).map(Age)
}
pub fn actual(&self) -> UnicodeVersion {
self.0
}
}
impl cmp::PartialOrd for Age {
fn partial_cmp(&self, other: &Age) -> Option<cmp::Ordering> {
match self.0.cmp(&other.0) {
cmp::Ordering::Greater => Some(cmp::Ordering::Less),
cmp::Ordering::Less => Some(cmp::Ordering::Greater),
cmp::Ordering::Equal => Some(cmp::Ordering::Equal),
}
}
}
pub trait CharAge {
fn age(self) -> Option<Age>;
}
impl CharAge for char {
#[inline]
fn age(self) -> Option<Age> {
Age::of(self)
}
}
#[cfg(test)]
mod tests {
use super::Age;
use unic_ucd_version::UnicodeVersion;
#[test]
fn test_values() {
assert_eq!(
Age::of('\u{0000}'),
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{0021}'),
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{0041}'),
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{007f}'),
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{0100}'),
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{01f5}'),
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{037e}'),
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{200c}'),
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{01f6}'),
Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{01f7}'),
Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{01f9}'),
Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{0860}'),
Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{0866}'),
Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{086a}'),
Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{fffe}'),
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{ffff}'),
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{10000}'),
Some(Age(UnicodeVersion {
major: 4,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{10001}'),
Some(Age(UnicodeVersion {
major: 4,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{e0100}'),
Some(Age(UnicodeVersion {
major: 4,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{e0101}'),
Some(Age(UnicodeVersion {
major: 4,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{e0170}'),
Some(Age(UnicodeVersion {
major: 4,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{e01ee}'),
Some(Age(UnicodeVersion {
major: 4,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{e01ef}'),
Some(Age(UnicodeVersion {
major: 4,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{10000}'),
Some(Age(UnicodeVersion {
major: 4,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{20000}'),
Some(Age(UnicodeVersion {
major: 3,
minor: 1,
micro: 0,
}))
);
assert_eq!(Age::of('\u{30000}'), None);
assert_eq!(Age::of('\u{40000}'), None);
assert_eq!(Age::of('\u{50000}'), None);
assert_eq!(Age::of('\u{60000}'), None);
assert_eq!(Age::of('\u{70000}'), None);
assert_eq!(Age::of('\u{80000}'), None);
assert_eq!(Age::of('\u{90000}'), None);
assert_eq!(Age::of('\u{a0000}'), None);
assert_eq!(Age::of('\u{b0000}'), None);
assert_eq!(Age::of('\u{c0000}'), None);
assert_eq!(Age::of('\u{d0000}'), None);
assert_eq!(Age::of('\u{e0000}'), None);
assert_eq!(Age::of('\u{efffd}'), None);
assert_eq!(
Age::of('\u{efffe}'),
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{effff}'),
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{f0000}'),
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{f0001}'),
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{ffffe}'),
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{fffff}'),
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{100000}'),
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{100001}'),
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{10fffe}'),
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert_eq!(
Age::of('\u{10ffff}'),
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
}
#[test]
fn test_cmp() {
assert!(Age::of('A') == Age::of('a'));
assert!(Age::of('A') > Age::of('Ɐ'));
assert!(Age::of('A') > Age::of('\u{10000}'));
assert!(Age::of('A') > Age::of('\u{D0000}'));
assert!(
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
})) == Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
})) > Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
})) > Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
})) > Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
})) > None
);
assert!(
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
})) < Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
})) == Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
})) > Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
})) > Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
})) > None
);
assert!(
Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
})) < Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
})) < Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
})) == Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
})) > Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
})) > None
);
assert!(
Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
})) < Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
})) < Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
})) < Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
})) == Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
}))
);
assert!(
Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
})) > None
);
assert!(
None < Some(Age(UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}))
);
assert!(
None < Some(Age(UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}))
);
assert!(
None < Some(Age(UnicodeVersion {
major: 3,
minor: 0,
micro: 0,
}))
);
assert!(
None < Some(Age(UnicodeVersion {
major: 10,
minor: 0,
micro: 0,
}))
);
}
#[test]
fn test_char_trait() {
use super::CharAge;
assert_eq!(
'\u{0000}'.age().unwrap().actual(),
UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}
);
assert_eq!(
'\u{0041}'.age().unwrap().actual(),
UnicodeVersion {
major: 1,
minor: 1,
micro: 0,
}
);
assert_eq!(
'\u{10ffff}'.age().unwrap().actual(),
UnicodeVersion {
major: 2,
minor: 0,
micro: 0,
}
);
}
}