ordinal_map/ordinal/impls/
char.rs1use 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}