diff options
| author | Martin Gammelsæter <martin@mg.am> | 2022-03-09 17:10:34 +0100 |
|---|---|---|
| committer | Martin Gammelsæter <martin@mg.am> | 2022-03-09 17:10:34 +0100 |
| commit | 876142417cd03ee0838d2fc83ddac83c06748ca6 (patch) | |
| tree | 617db42855a5736a462c0451165a38bfc3970b18 | |
| parent | 10dccdc7fcbdc64ee9efe2c1ed975ab8c1d61287 (diff) | |
| download | rust-876142417cd03ee0838d2fc83ddac83c06748ca6.tar.gz rust-876142417cd03ee0838d2fc83ddac83c06748ca6.zip | |
Optimize ascii::escape_default by using a digit LUT
| -rw-r--r-- | library/core/src/ascii.rs | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/library/core/src/ascii.rs b/library/core/src/ascii.rs index 532208e41af..20f2dd13d8f 100644 --- a/library/core/src/ascii.rs +++ b/library/core/src/ascii.rs @@ -98,15 +98,23 @@ pub fn escape_default(c: u8) -> EscapeDefault { b'\'' => ([b'\\', b'\'', 0, 0], 2), b'"' => ([b'\\', b'"', 0, 0], 2), b'\x20'..=b'\x7e' => ([c, 0, 0, 0], 1), - _ => ([b'\\', b'x', hexify(c >> 4), hexify(c & 0xf)], 4), + _ => { + let (b1, b2) = hexify(c); + ([b'\\', b'x', b1, b2], 4) + } }; return EscapeDefault { range: 0..len, data }; - fn hexify(b: u8) -> u8 { - match b { - 0..=9 => b'0' + b, - _ => b'a' + b - 10, + #[inline] + fn hexify(b: u8) -> (u8, u8) { + let hex_digits: &[u8; 16] = b"0123456789abcdef"; + // SAFETY: For all n: u8, n >> 4 < 16 and n & 0xf < 16 + unsafe { + ( + *hex_digits.get_unchecked((b >> 4) as usize), + *hex_digits.get_unchecked((b & 0xf) as usize), + ) } } } |
