Skip to content

Commit dc5debe

Browse files
morealSnowapril
authored andcommitted
Wrap range with its meaning
1 parent a25e6cf commit dc5debe

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
@@ -438,8 +438,7 @@ impl PyByteArray {
438438
let (affix, range) = options.get_value(self.len());
439439
self.borrow_buf().py_startsendswith(
440440
affix,
441-
range,
442-
AnyStr::get_bytes,
441+
anystr::AnyStrRange::BytesRange(range),
443442
"endswith",
444443
"bytes",
445444
|s, x: &PyBytesInner| s.ends_with(&x.elements[..]),
@@ -456,8 +455,7 @@ impl PyByteArray {
456455
let (affix, range) = options.get_value(self.len());
457456
self.borrow_buf().py_startsendswith(
458457
affix,
459-
range,
460-
AnyStr::get_bytes,
458+
anystr::AnyStrRange::BytesRange(range),
461459
"startswith",
462460
"bytes",
463461
|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,
@@ -715,11 +715,10 @@ impl PyStr {
715715
let (affix, range) = args.get_value(len);
716716
self.as_str().py_startsendswith(
717717
affix,
718-
range,
719718
if has_subrange {
720-
str::get_chars
719+
AnyStrRange::CharsRange(range)
721720
} else {
722-
str::get_bytes
721+
AnyStrRange::BytesRange(range)
723722
},
724723
"endswith",
725724
"str",
@@ -739,11 +738,10 @@ impl PyStr {
739738
let (affix, range) = args.get_value(len);
740739
self.as_str().py_startsendswith(
741740
affix,
742-
range,
743741
if has_subrange {
744-
str::get_chars
742+
AnyStrRange::CharsRange(range)
745743
} else {
746-
str::get_bytes
744+
AnyStrRange::BytesRange(range)
747745
},
748746
"startswith",
749747
"str",

0 commit comments

Comments
 (0)