From: Skgland Date: Sun, 26 Apr 2026 11:43:04 +0000 (+0200) Subject: optimize put_back_char X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=af54fb2aba46af538b4564045ba40ba7b854d1d3;p=scryer-prolog.git optimize put_back_char Always encode the char directly into the buffer. Only shift the buffer content if there isn't enough room in the front. --- diff --git a/src/parser/char_reader.rs b/src/parser/char_reader.rs index 69d592e1..1ad6971e 100644 --- a/src/parser/char_reader.rs +++ b/src/parser/char_reader.rs @@ -235,16 +235,17 @@ impl CharRead for CharReader { #[inline(always)] fn put_back_char(&mut self, c: char) { let c_len = c.len_utf8(); + if c_len <= self.pos { + self.pos -= c_len; + } else { + self.buf.insert_from_slice( + 0, + &[0u8; 4/* char::MAX_LEN_UTF8 once msrv reached 1.93 */][..c_len - self.pos], + ); + self.pos = 0; + } - let mut shifted_slice = SmallVec::<[u8; 32]>::new(); - shifted_slice.extend_from_slice(&self.buf[self.pos..]); - - self.buf.clear(); - self.buf.resize(c_len, 0); - c.encode_utf8(&mut self.buf[..c_len]); - - self.buf.extend_from_slice(&shifted_slice); - self.pos = 0; + c.encode_utf8(&mut self.buf[self.pos..]); } #[inline(always)]