#[derive(Clone, Copy)]
pub struct Utf8OneTwo {
pub shuffle: [u8; 16],
pub consumed: u8,
}
const EMPTY_UTF8_ONE_TWO: Utf8OneTwo = Utf8OneTwo { shuffle: [0xff; 16], consumed: 0 };
pub static UTF8_ONE_TWO: [Utf8OneTwo; 4096] = {
let mut table = [EMPTY_UTF8_ONE_TWO; 4096];
let mut mask = 0usize;
while mask < table.len() {
let mut row = EMPTY_UTF8_ONE_TWO;
let mut pos = 0usize;
let mut lane = 0usize;
let mut valid = true;
while lane < 6 {
if ((mask >> pos) & 1) != 0 {
row.shuffle[lane * 2] = pos as u8;
pos += 1;
} else if ((mask >> (pos + 1)) & 1) != 0 {
row.shuffle[lane * 2] = (pos + 1) as u8;
row.shuffle[lane * 2 + 1] = pos as u8;
pos += 2;
} else {
valid = false;
break;
}
lane += 1;
}
if valid {
row.consumed = pos as u8;
}
table[mask] = row;
mask += 1;
}
table
};
#[derive(Clone, Copy)]
pub struct Utf8OneTwoWide {
pub lo: [u8; 16],
pub hi: [u8; 16],
pub written: u8,
}
const EMPTY_UTF8_ONE_TWO_WIDE: Utf8OneTwoWide =
Utf8OneTwoWide { lo: [0xff; 16], hi: [0xff; 16], written: 0 };
pub static UTF8_ONE_TWO_WIDE: [Utf8OneTwoWide; 4096] = {
let mut table = [EMPTY_UTF8_ONE_TWO_WIDE; 4096];
let mut mask = 1usize;
while mask < table.len() {
let mut row = EMPTY_UTF8_ONE_TWO_WIDE;
let mut pos = 0usize;
let mut lane = 0usize;
let mut valid = true;
while pos < 12 {
let (end, start) = if ((mask >> pos) & 1) != 0 {
(pos, 0xff)
} else if pos + 1 < 12 && ((mask >> (pos + 1)) & 1) != 0 {
(pos + 1, pos)
} else if pos + 1 >= 12 {
break;
} else {
valid = false;
break;
};
if lane < 8 {
row.lo[lane * 2] = end as u8;
row.lo[lane * 2 + 1] = start as u8;
} else {
row.hi[(lane - 8) * 2] = end as u8;
row.hi[(lane - 8) * 2 + 1] = start as u8;
}
pos = end + 1;
lane += 1;
}
if valid && lane != 0 {
row.written = lane as u8;
}
table[mask] = row;
mask += 1;
}
table
};
#[derive(Clone, Copy)]
pub struct Utf16OneTwo {
pub shuffle: [u8; 16],
pub written: u8,
}
const EMPTY_UTF16_ONE_TWO: Utf16OneTwo = Utf16OneTwo { shuffle: [0xff; 16], written: 0 };
const fn build_utf16_one_two() -> [Utf16OneTwo; 256] {
let mut table = [EMPTY_UTF16_ONE_TWO; 256];
let mut mask = 0usize;
while mask < table.len() {
let mut row = EMPTY_UTF16_ONE_TWO;
let mut lane = 0usize;
let mut out = 0usize;
while lane < 8 {
row.shuffle[out] = (lane * 2) as u8;
out += 1;
if ((mask >> lane) & 1) == 0 {
row.shuffle[out] = (lane * 2 + 1) as u8;
out += 1;
}
lane += 1;
}
row.written = out as u8;
table[mask] = row;
mask += 1;
}
table
}
pub static UTF16_ONE_TWO: [Utf16OneTwo; 256] = build_utf16_one_two();
#[derive(Clone, Copy)]
pub struct Utf8OneTwoThree {
pub shuffle: [u8; 16],
pub consumed: u8,
}
const EMPTY_UTF8_ONE_TWO_THREE: Utf8OneTwoThree =
Utf8OneTwoThree { shuffle: [0xff; 16], consumed: 0 };
pub static UTF8_ONE_TWO_THREE: [Utf8OneTwoThree; 4096] = {
let mut table = [EMPTY_UTF8_ONE_TWO_THREE; 4096];
let mut mask = 0usize;
while mask < table.len() {
let mut row = EMPTY_UTF8_ONE_TWO_THREE;
let mut pos = 0usize;
let mut lane = 0usize;
let mut valid = true;
while lane < 4 {
let width = if ((mask >> pos) & 1) != 0 {
1
} else if ((mask >> (pos + 1)) & 1) != 0 {
2
} else if ((mask >> (pos + 2)) & 1) != 0 {
3
} else {
valid = false;
break;
};
let mut byte = 0usize;
while byte < width {
row.shuffle[lane * 4 + byte] = (pos + width - 1 - byte) as u8;
byte += 1;
}
pos += width;
lane += 1;
}
if valid {
row.consumed = pos as u8;
}
table[mask] = row;
mask += 1;
}
table
};
#[derive(Clone, Copy)]
pub struct Utf8OneTwoThreePack {
pub shuffle: [u8; 16],
pub written: u8,
}
pub static UTF8_ONE_TWO_THREE_PACK: [Utf8OneTwoThreePack; 256] = {
let mut table = [Utf8OneTwoThreePack { shuffle: [0xff; 16], written: 0 }; 256];
let mut flags = 0usize;
while flags < table.len() {
let mut row = Utf8OneTwoThreePack { shuffle: [0xff; 16], written: 0 };
let mut lane = 0usize;
let mut out = 0usize;
while lane < 4 {
let base = (lane * 4) as u8;
let one = (flags >> (lane * 2)) & 1 != 0;
let one_or_two = (flags >> (lane * 2 + 1)) & 1 != 0;
if one {
row.shuffle[out] = base;
out += 1;
} else if one_or_two {
row.shuffle[out] = base + 3;
row.shuffle[out + 1] = base + 1;
out += 2;
} else {
row.shuffle[out] = base + 2;
row.shuffle[out + 1] = base + 3;
row.shuffle[out + 2] = base + 1;
out += 3;
}
lane += 1;
}
row.written = out as u8;
table[flags] = row;
flags += 1;
}
table
};
#[derive(Clone, Copy)]
pub struct Utf8Four {
pub shuffle: [u8; 16],
pub written: u8,
}
const fn build_utf8_four() -> [Utf8Four; 256] {
let mut table = [Utf8Four { shuffle: [0xff; 16], written: 0 }; 256];
let mut widths = 0usize;
while widths < table.len() {
let mut row = Utf8Four { shuffle: [0xff; 16], written: 0 };
let mut lane = 0usize;
let mut out = 0usize;
while lane < 4 {
let width = ((widths >> (lane * 2)) & 3) + 1;
let mut byte = 0usize;
while byte < width {
row.shuffle[out] = (lane * 4 + byte) as u8;
out += 1;
byte += 1;
}
lane += 1;
}
row.written = out as u8;
table[widths] = row;
widths += 1;
}
table
}
pub static UTF8_FOUR: [Utf8Four; 256] = build_utf8_four();