Skip to content

Commit a18e6a7

Browse files
committed
Wrap range with its meaning
1 parent 580849d commit a18e6a7

File tree

4 files changed

+28
-20
lines changed

4 files changed

+28
-20
lines changed

vm/src/anystr.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ use crate::{
88
use num_traits::{cast::ToPrimitive, sign::Signed};
99
use std::str::FromStr;
1010

11+
pub enum AnyStrRange {
12+
CharsRange(std::ops::Range<usize>),
13+
BytesRange(std::ops::Range<usize>),
14+
}
15+
16+
impl AnyStrRange {
17+
pub fn is_normal(&self) -> bool {
18+
match self {
19+
AnyStrRange::CharsRange(range) | AnyStrRange::BytesRange(range) => range.is_normal(),
20+
}
21+
}
22+
}
23+
1124
#[derive(FromArgs)]
1225
pub struct SplitArgs<'s, T: TryFromObject + AnyStrWrapper<'s>> {
1326
#[pyarg(any, default)]
@@ -195,11 +208,10 @@ pub trait AnyStr<'s>: 's {
195208
F: Fn(&Self) -> PyObjectRef;
196209

197210
#[inline]
198-
fn py_startsendswith<T, F, FS>(
211+
fn py_startsendswith<T, F>(
199212
&self,
200213
affix: PyObjectRef,
201-
range: std::ops::Range<usize>,
202-
slicer: FS,
214+
range: AnyStrRange,
203215
func_name: &str,
204216
py_type_name: &str,
205217
func: F,
@@ -208,12 +220,14 @@ pub trait AnyStr<'s>: 's {
208220
where
209221
T: TryFromObject,
210222
F: Fn(&Self, &T) -> bool,
211-
FS: Fn(&Self, std::ops::Range<usize>) -> &Self,
212223
{
213224
if !range.is_normal() {
214225
return Ok(false);
215226
}
216-
let value = slicer(self, range);
227+
let value = match range {
228+
AnyStrRange::BytesRange(range) => self.get_bytes(range),
229+
AnyStrRange::CharsRange(range) => self.get_chars(range),
230+
};
217231

218232
single_or_tuple_any(
219233
affix,

vm/src/builtins/bytearray.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -433,8 +433,7 @@ impl PyByteArray {
433433
let (affix, range) = options.get_value(self.len());
434434
self.borrow_buf().py_startsendswith(
435435
affix,
436-
range,
437-
AnyStr::get_bytes,
436+
anystr::AnyStrRange::BytesRange(range),
438437
"endswith",
439438
"bytes",
440439
|s, x: &PyBytesInner| s.ends_with(&x.elements[..]),
@@ -451,8 +450,7 @@ impl PyByteArray {
451450
let (affix, range) = options.get_value(self.len());
452451
self.borrow_buf().py_startsendswith(
453452
affix,
454-
range,
455-
AnyStr::get_bytes,
453+
anystr::AnyStrRange::BytesRange(range),
456454
"startswith",
457455
"bytes",
458456
|s, x: &PyBytesInner| s.starts_with(&x.elements[..]),

vm/src/builtins/bytes.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,7 @@ impl PyBytes {
278278
let (affix, range) = options.get_value(self.len());
279279
self.inner.elements[..].py_startsendswith(
280280
affix,
281-
range,
282-
AnyStr::get_bytes,
281+
anystr::AnyStrRange::BytesRange(range),
283282
"endswith",
284283
"bytes",
285284
|s, x: &PyBytesInner| s.ends_with(&x.elements[..]),
@@ -296,8 +295,7 @@ impl PyBytes {
296295
let (affix, range) = options.get_value(self.len());
297296
self.inner.elements[..].py_startsendswith(
298297
affix,
299-
range,
300-
AnyStr::get_bytes,
298+
anystr::AnyStrRange::BytesRange(range),
301299
"startswith",
302300
"bytes",
303301
|s, x: &PyBytesInner| s.starts_with(&x.elements[..]),

vm/src/builtins/pystr.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use super::{
44
PositionIterInternal, PyBytesRef, PyDict, PyTupleRef, PyTypeRef,
55
};
66
use crate::{
7-
anystr::{self, adjust_indices, AnyStr, AnyStrContainer, AnyStrWrapper},
7+
anystr::{self, adjust_indices, AnyStr, AnyStrContainer, AnyStrRange, AnyStrWrapper},
88
format::{FormatSpec, FormatString, FromTemplate},
99
function::{ArgIterable, FuncArgs, IntoPyException, IntoPyObject, OptionalArg, OptionalOption},
1010
protocol::PyIterReturn,
@@ -697,11 +697,10 @@ impl PyStr {
697697
let (affix, range) = args.get_value(len);
698698
self.as_str().py_startsendswith(
699699
affix,
700-
range,
701700
if has_subrange {
702-
str::get_chars
701+
AnyStrRange::CharsRange(range)
703702
} else {
704-
str::get_bytes
703+
AnyStrRange::BytesRange(range)
705704
},
706705
"endswith",
707706
"str",
@@ -721,11 +720,10 @@ impl PyStr {
721720
let (affix, range) = args.get_value(len);
722721
self.as_str().py_startsendswith(
723722
affix,
724-
range,
725723
if has_subrange {
726-
str::get_chars
724+
AnyStrRange::CharsRange(range)
727725
} else {
728-
str::get_bytes
726+
AnyStrRange::BytesRange(range)
729727
},
730728
"startswith",
731729
"str",

0 commit comments

Comments
 (0)