Skip to content

Commit 81abec4

Browse files
committed
common string strip implemenetation
1 parent ce2d9d8 commit 81abec4

3 files changed

Lines changed: 57 additions & 43 deletions

File tree

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,
@@ -470,36 +470,35 @@ impl PyString {
470470
}
471471

472472
#[pymethod]
473-
fn strip(&self, chars: OptionalArg<Option<PyStringRef>>) -> String {
474-
let chars = chars.flat_option();
475-
let chars = match chars {
476-
Some(ref chars) => &chars.value,
477-
None => return self.value.trim().to_owned(),
478-
};
479-
self.value.trim_matches(|c| chars.contains(c)).to_owned()
473+
fn strip(&self, chars: OptionalOption<PyStringRef>) -> String {
474+
self.value
475+
.py_strip(
476+
chars,
477+
|s, chars| s.trim_matches(|c| chars.contains(c)),
478+
|s| s.trim(),
479+
)
480+
.to_owned()
480481
}
481482

482483
#[pymethod]
483-
fn lstrip(&self, chars: OptionalArg<Option<PyStringRef>>) -> String {
484-
let chars = chars.flat_option();
485-
let chars = match chars {
486-
Some(ref chars) => &chars.value,
487-
None => return self.value.trim_start().to_owned(),
488-
};
484+
fn lstrip(&self, chars: OptionalOption<PyStringRef>) -> String {
489485
self.value
490-
.trim_start_matches(|c| chars.contains(c))
486+
.py_strip(
487+
chars,
488+
|s, chars| s.trim_start_matches(|c| chars.contains(c)),
489+
|s| s.trim_start(),
490+
)
491491
.to_owned()
492492
}
493493

494494
#[pymethod]
495-
fn rstrip(&self, chars: OptionalArg<Option<PyStringRef>>) -> String {
496-
let chars = chars.flat_option();
497-
let chars = match chars {
498-
Some(ref chars) => &chars.value,
499-
None => return self.value.trim_end().to_owned(),
500-
};
495+
fn rstrip(&self, chars: OptionalOption<PyStringRef>) -> String {
501496
self.value
502-
.trim_end_matches(|c| chars.contains(c))
497+
.py_strip(
498+
chars,
499+
|s, chars| s.trim_end_matches(|c| chars.contains(c)),
500+
|s| s.trim_end(),
501+
)
503502
.to_owned()
504503
}
505504

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)