File tree Expand file tree Collapse file tree 1 file changed +35
-0
lines changed Expand file tree Collapse file tree 1 file changed +35
-0
lines changed Original file line number Diff line number Diff line change @@ -1168,6 +1168,38 @@ impl PyByteInner {
1168
1168
result
1169
1169
}
1170
1170
1171
+ pub fn replace_in_place (
1172
+ & self ,
1173
+ from : PyByteInner ,
1174
+ to : PyByteInner ,
1175
+ maxcount : Option < usize > ,
1176
+ ) -> Vec < u8 > {
1177
+ let len = from. len ( ) ;
1178
+ let mut iter = self . elements . find_iter ( & from. elements ) ;
1179
+
1180
+ let mut new = if let Some ( offset) = iter. next ( ) {
1181
+ let mut new = self . elements . clone ( ) ;
1182
+ new[ offset..offset + len] . clone_from_slice ( to. elements . as_slice ( ) ) ;
1183
+ if maxcount == Some ( 1 ) {
1184
+ return new;
1185
+ } else {
1186
+ new
1187
+ }
1188
+ } else {
1189
+ return self . elements . clone ( ) ;
1190
+ } ;
1191
+
1192
+ let mut count = maxcount. unwrap_or ( std:: usize:: MAX ) - 1 ;
1193
+ for offset in iter {
1194
+ new[ offset..offset + len] . clone_from_slice ( to. elements . as_slice ( ) ) ;
1195
+ count -= 1 ;
1196
+ if count == 0 {
1197
+ break ;
1198
+ }
1199
+ }
1200
+ new
1201
+ }
1202
+
1171
1203
fn replace_general (
1172
1204
& self ,
1173
1205
from : PyByteInner ,
@@ -1248,6 +1280,9 @@ impl PyByteInner {
1248
1280
if to. elements . is_empty ( ) {
1249
1281
// delete all occurrences of 'from' bytes
1250
1282
Ok ( self . replace_delete ( from, maxcount) )
1283
+ } else if from. len ( ) == to. len ( ) {
1284
+ // Handle special case where both bytes have the same length
1285
+ Ok ( self . replace_in_place ( from, to, maxcount) )
1251
1286
} else {
1252
1287
// Otherwise use the more generic algorithms
1253
1288
self . replace_general ( from, to, maxcount, vm)
You can’t perform that action at this time.
0 commit comments