From 2c349213dde6814cfafaf85a0b49802b3191f1c9 Mon Sep 17 00:00:00 2001 From: Marijn Schouten Date: Mon, 23 Dec 2024 18:08:38 +0100 Subject: [PATCH] simplify Iterator::next for PercentEncode This reduces duplication including of an unsafe block... Signed-off-by: Marijn Schouten --- percent_encoding/src/lib.rs | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/percent_encoding/src/lib.rs b/percent_encoding/src/lib.rs index fba0cd91..5432ff50 100644 --- a/percent_encoding/src/lib.rs +++ b/percent_encoding/src/lib.rs @@ -153,18 +153,15 @@ impl<'a> Iterator for PercentEncode<'a> { self.bytes = remaining; Some(percent_encode_byte(first_byte)) } else { - // The unsafe blocks here are appropriate because the bytes are - // confirmed as a subset of UTF-8 in should_percent_encode. - for (i, &byte) in remaining.iter().enumerate() { - if self.ascii_set.should_percent_encode(byte) { - // 1 for first_byte + i for previous iterations of this loop - let (unchanged_slice, remaining) = self.bytes.split_at(1 + i); - self.bytes = remaining; - return Some(unsafe { str::from_utf8_unchecked(unchanged_slice) }); - } - } - let unchanged_slice = self.bytes; - self.bytes = &[][..]; + let (unchanged_slice, remaining) = self.bytes.split_at( + // 1 for the first byte + rest in remaining + 1 + remaining + .iter() + .position(|&byte| self.ascii_set.should_percent_encode(byte)) + .unwrap_or(remaining.len()), + ); + self.bytes = remaining; + // SAFETY: bytes are confirmed as a subset of UTF-8 in should_percent_encode. Some(unsafe { str::from_utf8_unchecked(unchanged_slice) }) } } else {