use unicode_canonical_combining_class::get_canonical_combining_class;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)]
pub enum ModifiedCombiningClass {
NotReordered = 0,
Overlay = 1,
CCC3 = 3,
CCC4 = 4,
CCC5 = 5,
HanReading = 6,
Nukta = 7,
KanaVoicing = 8,
Virama = 9,
CCC10 = 10,
CCC11 = 11,
CCC12 = 12,
CCC13 = 13,
CCC14 = 14,
CCC15 = 15,
CCC16 = 16,
CCC17 = 17,
CCC18 = 18,
CCC19 = 19,
CCC20 = 20,
CCC21 = 21,
CCC22 = 22,
CCC23 = 23,
CCC24 = 24,
CCC25 = 25,
CCC26 = 26,
CCC27 = 27,
CCC28 = 28,
CCC29 = 29,
CCC30 = 30,
CCC31 = 31,
CCC32 = 32,
CCC33 = 33,
CCC34 = 34,
CCC35 = 35,
CCC36 = 36,
CCC107 = 107,
CCC118 = 118,
CCC122 = 122,
CCC129 = 129,
CCC130 = 130,
CCC132 = 132,
AttachedBelow = 202,
AttachedAbove = 214,
AttachedAboveRight = 216,
BelowLeft = 218,
Below = 220,
BelowRight = 222,
Left = 224,
Right = 226,
AboveLeft = 228,
Above = 230,
AboveRight = 232,
DoubleBelow = 233,
DoubleAbove = 234,
IotaSubscript = 240,
}
const X: ModifiedCombiningClass = ModifiedCombiningClass::NotReordered;
use ModifiedCombiningClass::*;
const MODIFIED_COMBINING_CLASS: &[ModifiedCombiningClass; 256] = &[
NotReordered, Overlay, X, X, X, X, HanReading, Nukta, KanaVoicing, Virama, CCC22, CCC15, CCC16, CCC17, CCC23, CCC18, CCC19, CCC20, CCC21, CCC14, CCC24, CCC12, CCC25, CCC13, CCC10, CCC11, CCC26, CCC27, CCC28, CCC29, CCC30, CCC31, CCC32, CCC33, CCC34, CCC35, CCC36, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, CCC4, X, X, X, X, X, X, CCC5, X, X, X, X, X, X, X, X, X, X, X, CCC3, X, X, X, CCC107, X, X, X, X, X, X, X, X, X, X, CCC118, X, X, X, CCC122, X, X, X, X, X, X, CCC129, CCC130, X, CCC132, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, AttachedBelow, X, X, X, X, X, X, X, X, X, X, X, AttachedAbove, X, AttachedAboveRight, X, BelowLeft, X, Below, X, BelowRight, X, Left, X, Right, X, AboveLeft, X, Above, X, AboveRight, DoubleBelow, DoubleAbove, X, X, X, X, X, IotaSubscript, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, ];
pub fn modified_combining_class(c: char) -> ModifiedCombiningClass {
if c <= '\u{02FF}' {
ModifiedCombiningClass::NotReordered
} else {
MODIFIED_COMBINING_CLASS[get_canonical_combining_class(c) as usize]
}
}
pub fn sort_by_modified_combining_class(cs: &mut [char]) {
for css in
cs.split_mut(|&c| modified_combining_class(c) == ModifiedCombiningClass::NotReordered)
{
css.sort_by_key(|&c| modified_combining_class(c));
}
}