Skip to content

Commit d3449ae

Browse files
authored
Merge pull request RustPython#1876 from youknowone/share-strip
shared string strip implemenetation
2 parents 522034c + 81abec4 commit d3449ae

File tree

3 files changed

+57
-43
lines changed

3 files changed

+57
-43
lines changed

vm/src/obj/objbyteinner.rs

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -893,36 +893,33 @@ impl PyByteInner {
893893
}
894894

895895
pub fn strip(&self, chars: OptionalOption<PyByteInner>) -> Vec<u8> {
896-
let chars = chars.flat_option();
897-
let chars = match chars {
898-
Some(ref chars) => &chars.elements,
899-
None => return self.elements.trim().to_owned(),
900-
};
901896
self.elements
902-
.trim_with(|c| chars.contains(&(c as u8)))
903-
.to_owned()
897+
.py_strip(
898+
chars,
899+
|s, chars| s.trim_with(|c| chars.contains(&(c as u8))),
900+
|s| s.trim(),
901+
)
902+
.to_vec()
904903
}
905904

906905
pub fn lstrip(&self, chars: OptionalOption<PyByteInner>) -> Vec<u8> {
907-
let chars = chars.flat_option();
908-
let chars = match chars {
909-
Some(ref chars) => &chars.elements,
910-
None => return self.elements.trim_start().to_owned(),
911-
};
912906
self.elements
913-
.trim_start_with(|c| chars.contains(&(c as u8)))
914-
.to_owned()
907+
.py_strip(
908+
chars,
909+
|s, chars| s.trim_start_with(|c| chars.contains(&(c as u8))),
910+
|s| s.trim_start(),
911+
)
912+
.to_vec()
915913
}
916914

917915
pub fn rstrip(&self, chars: OptionalOption<PyByteInner>) -> Vec<u8> {
918-
let chars = chars.flat_option();
919-
let chars = match chars {
920-
Some(ref chars) => &chars.elements,
921-
None => return self.elements.trim_end().to_owned(),
922-
};
923916
self.elements
924-
.trim_end_with(|c| chars.contains(&(c as u8)))
925-
.to_owned()
917+
.py_strip(
918+
chars,
919+
|s, chars| s.trim_end_with(|c| chars.contains(&(c as u8))),
920+
|s| s.trim_end(),
921+
)
922+
.to_vec()
926923
}
927924

928925
pub fn split<F>(

vm/src/obj/objstr.rs

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::cformat::{
2727
CNumberType,
2828
};
2929
use crate::format::{FormatParseError, FormatPart, FormatPreconversor, FormatSpec, FormatString};
30-
use crate::function::{OptionalArg, PyFuncArgs};
30+
use crate::function::{OptionalArg, OptionalOption, PyFuncArgs};
3131
use crate::pyhash;
3232
use crate::pyobject::{
3333
Either, IdProtocol, IntoPyObject, ItemProtocol, PyClassImpl, PyContext, PyIterable,
@@ -474,36 +474,35 @@ impl PyString {
474474
}
475475

476476
#[pymethod]
477-
fn strip(&self, chars: OptionalArg<Option<PyStringRef>>) -> String {
478-
let chars = chars.flat_option();
479-
let chars = match chars {
480-
Some(ref chars) => &chars.value,
481-
None => return self.value.trim().to_owned(),
482-
};
483-
self.value.trim_matches(|c| chars.contains(c)).to_owned()
477+
fn strip(&self, chars: OptionalOption<PyStringRef>) -> String {
478+
self.value
479+
.py_strip(
480+
chars,
481+
|s, chars| s.trim_matches(|c| chars.contains(c)),
482+
|s| s.trim(),
483+
)
484+
.to_owned()
484485
}
485486

486487
#[pymethod]
487-
fn lstrip(&self, chars: OptionalArg<Option<PyStringRef>>) -> String {
488-
let chars = chars.flat_option();
489-
let chars = match chars {
490-
Some(ref chars) => &chars.value,
491-
None => return self.value.trim_start().to_owned(),
492-
};
488+
fn lstrip(&self, chars: OptionalOption<PyStringRef>) -> String {
493489
self.value
494-
.trim_start_matches(|c| chars.contains(c))
490+
.py_strip(
491+
chars,
492+
|s, chars| s.trim_start_matches(|c| chars.contains(c)),
493+
|s| s.trim_start(),
494+
)
495495
.to_owned()
496496
}
497497

498498
#[pymethod]
499-
fn rstrip(&self, chars: OptionalArg<Option<PyStringRef>>) -> String {
500-
let chars = chars.flat_option();
501-
let chars = match chars {
502-
Some(ref chars) => &chars.value,
503-
None => return self.value.trim_end().to_owned(),
504-
};
499+
fn rstrip(&self, chars: OptionalOption<PyStringRef>) -> String {
505500
self.value
506-
.trim_end_matches(|c| chars.contains(c))
501+
.py_strip(
502+
chars,
503+
|s, chars| s.trim_end_matches(|c| chars.contains(c)),
504+
|s| s.trim_end(),
505+
)
507506
.to_owned()
508507
}
509508

vm/src/obj/pystr.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,22 @@ pub trait PyCommonString<E> {
171171
Ok(false)
172172
}
173173
}
174+
175+
fn py_strip<'a, S, FC, FD>(
176+
&'a self,
177+
chars: OptionalOption<S>,
178+
func_chars: FC,
179+
func_default: FD,
180+
) -> &'a Self
181+
where
182+
S: PyCommonStringWrapper<Self>,
183+
FC: Fn(&'a Self, &Self) -> &'a Self,
184+
FD: Fn(&'a Self) -> &'a Self,
185+
{
186+
let chars = chars.flat_option();
187+
match chars {
188+
Some(chars) => func_chars(self, chars.as_ref()),
189+
None => func_default(self),
190+
}
191+
}
174192
}

0 commit comments

Comments
 (0)