Skip to main content

ordinal_map/ordinal/impls/
char.rs

1use crate::Ordinal;
2
3const SURROGATE_START: u32 = 0xd800;
4
5impl Ordinal for char {
6    const ORDINAL_SIZE: usize = char::MAX as usize + 1 - 0x800;
7
8    fn ordinal(&self) -> usize {
9        let c = *self as u32;
10        if c < SURROGATE_START {
11            c as usize
12        } else {
13            c as usize - 0x800
14        }
15    }
16
17    fn from_ordinal(ordinal: usize) -> Option<Self> {
18        if ordinal < SURROGATE_START as usize {
19            char::from_u32(ordinal as u32)
20        } else {
21            char::from_u32((ordinal as u32).checked_add(0x800)?)
22        }
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use crate::tests::util::test_ordinal;
29
30    #[test]
31    fn test_char() {
32        test_ordinal((0..=(char::MAX as u32)).filter_map(char::from_u32))
33    }
34}