#![allow(unused)]
#![allow(non_upper_case_globals)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
use crate::graphic::*;
use crate::tables::*;
use std::sync::Arc;
pub fn Is(range_tab: Arc<RangeTable>, r: i32) -> bool {
let r16 = &range_tab.R16;
if r16.len() > 0 && r as u32 <= r16[r16.len() - 1].Hi as u32 {
return is16(r16, r as u16);
}
let r32 = &range_tab.R32;
if r32.len() > 0 && r as u32 >= r32[0].Lo {
return is32(r32, r as u32);
}
return false;
}
const linearMax: usize = 18;
fn is16(ranges: &[Range16], r: u16) -> bool {
if ranges.len() <= linearMax || r <= MaxLatin1 as u16 {
for range_ in ranges {
if r < range_.Lo {
return false;
}
if r <= range_.Hi {
return range_.Stride == 1 || (r - range_.Lo) % range_.Stride == 0;
}
}
return false;
}
let mut lo = 0;
let mut hi = ranges.len();
while lo < hi {
let m = lo + (hi - lo) / 2;
let range_ = &ranges[m];
if range_.Lo <= r && r <= range_.Hi {
return range_.Stride == 1 || (r - range_.Lo) % range_.Stride == 0;
}
if r < range_.Lo {
hi = m;
} else {
lo = m + 1;
}
}
return false;
}
fn is32(ranges: &[Range32], r: u32) -> bool {
if ranges.len() <= linearMax {
for range_ in ranges {
if r < range_.Lo {
return false;
}
if r <= range_.Hi {
return range_.Stride == 1 || (r - range_.Lo) % range_.Stride == 0;
}
}
return false;
}
let mut lo = 0;
let mut hi = ranges.len();
while lo < hi {
let m = lo + (hi - lo) / 2;
let range_ = &ranges[m];
if range_.Lo <= r && r <= range_.Hi {
return range_.Stride == 1 || (r - range_.Lo) % range_.Stride == 0;
}
if r < range_.Lo {
hi = m;
} else {
lo = m + 1;
}
}
return false;
}
pub(crate) fn isExcludingLatin(range_tab: Arc<RangeTable>, r: i32) -> bool {
let r16 = &range_tab.R16;
if r16.len() > range_tab.LatinOffset && r as u32 <= r16[r16.len() - 1].Hi as u32 {
return is16(&r16[range_tab.LatinOffset..], r as u16);
}
let r32 = &range_tab.R32;
if r32.len() > 0 && r as u32 >= r32[0].Lo {
return is32(r32, r as u32);
}
return false;
}
#[test]
fn test_negative_rune() {
let non_latin1: Vec<u32> = vec![
0x0100, 0x0101, 0x01C5, 0x0300, 0x0660, 0x037E, 0x02C2, 0x1680, ];
for i in 0..(MaxLatin1 as isize + non_latin1.len() as isize) {
let base: u32 = if i >= MaxLatin1 as isize {
non_latin1[(i - MaxLatin1 as isize) as usize]
} else {
i as u32
};
println!("base(u32): {}", base);
let r: i32 = (base as i64 - ((1 << 31) as i64)) as i32;
assert_eq!(Is(Letter.clone(), r), false);
assert_eq!(IsLetter(r), false);
assert_eq!(IsPrint(r), false);
}
}