Skip to content

Commit bb7bbba

Browse files
committed
switch from char_indices back to while-loop for check_raw_*
1 parent d723f33 commit bb7bbba

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

src/lib.rs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -126,16 +126,28 @@ trait CheckRaw {
126126
src: &str,
127127
mut callback: impl FnMut(Range<usize>, Result<Self::RawUnit, EscapeError>),
128128
) {
129-
src.char_indices().for_each(|(pos, c)| {
130-
callback(
131-
pos..pos + c.len_utf8(),
132-
if c == '\r' {
133-
Err(EscapeError::BareCarriageReturnInRawString)
134-
} else {
135-
Self::char2raw_unit(c)
136-
},
137-
);
138-
});
129+
let mut chars = src.chars();
130+
while let Some(c) = chars.next() {
131+
let start = src.len() - chars.as_str().len() - c.len_utf8();
132+
let res = match c {
133+
'\r' => Err(EscapeError::BareCarriageReturn),
134+
_ => Self::char2raw_unit(c),
135+
};
136+
let end = src.len() - chars.as_str().len();
137+
callback(start..end, res);
138+
}
139+
140+
// Unfortunately, it is a bit unclear whether the following equivalent code is slower or faster: bug 141855
141+
// src.char_indices().for_each(|(pos, c)| {
142+
// callback(
143+
// pos..pos + c.len_utf8(),
144+
// if c == '\r' {
145+
// Err(EscapeError::BareCarriageReturnInRawString)
146+
// } else {
147+
// Self::char2raw_unit(c)
148+
// },
149+
// );
150+
// });
139151
}
140152
}
141153

0 commit comments

Comments
 (0)