@@ -34,7 +34,7 @@ pub trait PySliceableSequenceMut {
34
34
return Err ( vm. new_value_error ( "slice step cannot be zero" . to_owned ( ) ) ) ;
35
35
}
36
36
if step == BigInt :: one ( ) {
37
- let range = self . as_slice ( ) . get_slice_range ( & start, & stop) ;
37
+ let range = self . as_slice ( ) . saturate_range ( & start, & stop) ;
38
38
let range = if range. end < range. start {
39
39
range. start ..range. start
40
40
} else {
@@ -67,7 +67,7 @@ pub trait PySliceableSequenceMut {
67
67
( start, stop, step, false )
68
68
} ;
69
69
70
- let range = self . as_slice ( ) . get_slice_range ( & start, & stop) ;
70
+ let range = self . as_slice ( ) . saturate_range ( & start, & stop) ;
71
71
let range = if range. end < range. start {
72
72
range. start ..range. start
73
73
} else {
@@ -137,7 +137,7 @@ pub trait PySliceableSequenceMut {
137
137
}
138
138
139
139
if step == BigInt :: one ( ) {
140
- let range = self . as_slice ( ) . get_slice_range ( & start, & stop) ;
140
+ let range = self . as_slice ( ) . saturate_range ( & start, & stop) ;
141
141
if range. start < range. end {
142
142
self . do_delete_range ( range) ;
143
143
}
@@ -167,7 +167,7 @@ pub trait PySliceableSequenceMut {
167
167
( start, stop, step, false )
168
168
} ;
169
169
170
- let range = self . as_slice ( ) . get_slice_range ( & start, & stop) ;
170
+ let range = self . as_slice ( ) . saturate_range ( & start, & stop) ;
171
171
if range. start >= range. end {
172
172
return Ok ( ( ) ) ;
173
173
}
@@ -251,19 +251,35 @@ pub trait PySliceableSequence {
251
251
fn len ( & self ) -> usize ;
252
252
fn is_empty ( & self ) -> bool ;
253
253
254
- fn get_pos ( & self , p : isize ) -> Option < usize > {
255
- get_pos ( p, self . len ( ) )
254
+ fn wrap_index ( & self , p : isize ) -> Option < usize > {
255
+ wrap_index ( p, self . len ( ) )
256
256
}
257
257
258
- fn get_slice_pos ( & self , slice_pos : & BigInt ) -> usize {
259
- get_slice_pos ( slice_pos , self . len ( ) )
258
+ fn saturate_index ( & self , p : isize ) -> usize {
259
+ saturate_index ( p , self . len ( ) )
260
260
}
261
261
262
- fn get_slice_range ( & self , start : & Option < BigInt > , stop : & Option < BigInt > ) -> Range < usize > {
263
- let start = start. as_ref ( ) . map ( |x| self . get_slice_pos ( x) ) . unwrap_or ( 0 ) ;
262
+ fn saturate_big_index ( & self , slice_pos : & BigInt ) -> usize {
263
+ let len = self . len ( ) ;
264
+ if let Some ( pos) = slice_pos. to_isize ( ) {
265
+ self . saturate_index ( pos)
266
+ } else if slice_pos. is_negative ( ) {
267
+ // slice past start bound, round to start
268
+ 0
269
+ } else {
270
+ // slice past end bound, round to end
271
+ len
272
+ }
273
+ }
274
+
275
+ fn saturate_range ( & self , start : & Option < BigInt > , stop : & Option < BigInt > ) -> Range < usize > {
276
+ let start = start
277
+ . as_ref ( )
278
+ . map ( |x| self . saturate_big_index ( x) )
279
+ . unwrap_or ( 0 ) ;
264
280
let stop = stop
265
281
. as_ref ( )
266
- . map ( |x| self . get_slice_pos ( x) )
282
+ . map ( |x| self . saturate_big_index ( x) )
267
283
. unwrap_or_else ( || self . len ( ) ) ;
268
284
269
285
start..stop
@@ -276,7 +292,7 @@ pub trait PySliceableSequence {
276
292
if step. is_zero ( ) {
277
293
Err ( vm. new_value_error ( "slice step cannot be zero" . to_owned ( ) ) )
278
294
} else if step. is_positive ( ) {
279
- let range = self . get_slice_range ( & start, & stop) ;
295
+ let range = self . saturate_range ( & start, & stop) ;
280
296
if range. start < range. end {
281
297
#[ allow( clippy:: range_plus_one) ]
282
298
match step. to_i32 ( ) {
@@ -304,7 +320,7 @@ pub trait PySliceableSequence {
304
320
x + 1
305
321
}
306
322
} ) ;
307
- let range = self . get_slice_range ( & stop, & start) ;
323
+ let range = self . saturate_range ( & stop, & start) ;
308
324
if range. start < range. end {
309
325
match ( -step) . to_i32 ( ) {
310
326
Some ( 1 ) => Ok ( self . do_slice_reverse ( range) ) ,
@@ -403,7 +419,8 @@ impl TryFromObject for SequenceIndex {
403
419
// }
404
420
// }
405
421
406
- pub fn get_pos ( p : isize , len : usize ) -> Option < usize > {
422
+ // Use PySliceableSequence::wrap_index for implementors
423
+ pub ( crate ) fn wrap_index ( p : isize , len : usize ) -> Option < usize > {
407
424
let neg = p. is_negative ( ) ;
408
425
let p = p. abs ( ) . to_usize ( ) ?;
409
426
if neg {
@@ -416,7 +433,7 @@ pub fn get_pos(p: isize, len: usize) -> Option<usize> {
416
433
}
417
434
418
435
// return pos is in range [0, len] inclusive
419
- pub fn get_saturated_pos ( p : isize , len : usize ) -> usize {
436
+ pub ( crate ) fn saturate_index ( p : isize , len : usize ) -> usize {
420
437
let mut p = p;
421
438
let len = len. to_isize ( ) . unwrap ( ) ;
422
439
if p < 0 {
@@ -431,26 +448,9 @@ pub fn get_saturated_pos(p: isize, len: usize) -> usize {
431
448
p as usize
432
449
}
433
450
434
- pub fn get_slice_pos ( slice_pos : & BigInt , len : usize ) -> usize {
435
- if let Some ( pos) = slice_pos. to_isize ( ) {
436
- if let Some ( index) = get_pos ( pos, len) {
437
- // within bounds
438
- return index;
439
- }
440
- }
441
-
442
- if slice_pos. is_negative ( ) {
443
- // slice past start bound, round to start
444
- 0
445
- } else {
446
- // slice past end bound, round to end
447
- len
448
- }
449
- }
450
-
451
- // pub fn get_slice_range(start: &Option<BigInt>, stop: &Option<BigInt>, len: usize) -> Range<usize> {
452
- // let start = start.as_ref().map_or(0, |x| get_slice_pos(x, len));
453
- // let stop = stop.as_ref().map_or(len, |x| get_slice_pos(x, len));
451
+ // pub fn saturate_range(start: &Option<BigInt>, stop: &Option<BigInt>, len: usize) -> Range<usize> {
452
+ // let start = start.as_ref().map_or(0, |x| saturate_big_index(x, len));
453
+ // let stop = stop.as_ref().map_or(len, |x| saturate_big_index(x, len));
454
454
455
455
// start..stop
456
456
// }
@@ -466,7 +466,7 @@ pub fn get_item(
466
466
vm. new_index_error ( "cannot fit 'int' into an index-sized integer" . to_owned ( ) )
467
467
} ) ?;
468
468
let pos_index = elements
469
- . get_pos ( value)
469
+ . wrap_index ( value)
470
470
. ok_or_else ( || vm. new_index_error ( "Index out of bounds!" . to_owned ( ) ) ) ?;
471
471
Ok ( Either :: A ( elements[ pos_index] . clone ( ) ) )
472
472
} else {
@@ -480,7 +480,7 @@ pub fn get_item(
480
480
}
481
481
}
482
482
483
- //Check if given arg could be used with PySliceableSequence.get_slice_range ()
483
+ //Check if given arg could be used with PySliceableSequence.saturate_range ()
484
484
// pub fn is_valid_slice_arg(
485
485
// arg: OptionalArg<PyObjectRef>,
486
486
// vm: &VirtualMachine,
0 commit comments