From 9ffb43a1e4c4528af333beb888f48ca64867cfb1 Mon Sep 17 00:00:00 2001 From: Alisa Sireneva Date: Mon, 19 Aug 2024 11:40:06 +0300 Subject: [PATCH] Optimize Unicode decoding by 1% --- src/read.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/read.rs b/src/read.rs index 6d65a3e..9a489fb 100644 --- a/src/read.rs +++ b/src/read.rs @@ -1055,15 +1055,17 @@ static HEX0: [i16; 256] = build_hex_table(0); static HEX1: [i16; 256] = build_hex_table(4); fn decode_four_hex_digits(a: u8, b: u8, c: u8, d: u8) -> Option { - let a = HEX1[a as usize]; - let b = HEX0[b as usize]; - let c = HEX1[c as usize]; - let d = HEX0[d as usize]; + let a = HEX1[a as usize] as i32; + let b = HEX0[b as usize] as i32; + let c = HEX1[c as usize] as i32; + let d = HEX0[d as usize] as i32; + + let codepoint = ((a | b) << 8) | c | d; // A single sign bit check. - if (a | b | c | d) < 0 { - return None; + if codepoint >= 0 { + Some(codepoint as u16) + } else { + None } - - Some((((a | b) << 8) | c | d) as u16) }