@@ -21,13 +21,13 @@ use super::objsequence::PySliceableSequence;
2121use super :: objslice:: PySliceRef ;
2222use super :: objtuple;
2323use super :: objtype:: { self , PyClassRef } ;
24- use super :: pystr:: PyCommonString ;
24+ use super :: pystr:: { adjust_indices , PyCommonString , StringRange } ;
2525use crate :: cformat:: {
2626 CFormatPart , CFormatPreconversor , CFormatQuantity , CFormatSpec , CFormatString , CFormatType ,
2727 CNumberType ,
2828} ;
2929use crate :: format:: { FormatParseError , FormatPart , FormatPreconversor , FormatSpec , FormatString } ;
30- use crate :: function:: { single_or_tuple_any , OptionalArg , PyFuncArgs } ;
30+ use crate :: function:: { OptionalArg , PyFuncArgs } ;
3131use crate :: pyhash;
3232use crate :: pyobject:: {
3333 Either , IdProtocol , IntoPyObject , ItemProtocol , PyClassImpl , PyContext , PyIterable ,
@@ -525,23 +525,15 @@ impl PyString {
525525 end : OptionalArg < Option < isize > > ,
526526 vm : & VirtualMachine ,
527527 ) -> PyResult < bool > {
528- let range = adjust_indices ( start, end, self . value . len ( ) ) ;
529- if range. is_normal ( ) {
530- let value = & self . value [ range] ;
531- single_or_tuple_any (
532- suffix,
533- |s : & PyStringRef | Ok ( value. ends_with ( & s. value ) ) ,
534- |o| {
535- format ! (
536- "endswith first arg must be str or a tuple of str, not {}" ,
537- o. class( ) ,
538- )
539- } ,
540- vm,
541- )
542- } else {
543- Ok ( false )
544- }
528+ self . value . as_str ( ) . py_startsendswith (
529+ suffix,
530+ start,
531+ end,
532+ "endswith" ,
533+ "str" ,
534+ |s, x : & PyStringRef | s. ends_with ( x. as_str ( ) ) ,
535+ vm,
536+ )
545537 }
546538
547539 #[ pymethod]
@@ -552,23 +544,15 @@ impl PyString {
552544 end : OptionalArg < Option < isize > > ,
553545 vm : & VirtualMachine ,
554546 ) -> PyResult < bool > {
555- let range = adjust_indices ( start, end, self . value . len ( ) ) ;
556- if range. is_normal ( ) {
557- let value = & self . value [ range] ;
558- single_or_tuple_any (
559- prefix,
560- |s : & PyStringRef | Ok ( value. starts_with ( & s. value ) ) ,
561- |o| {
562- format ! (
563- "startswith first arg must be str or a tuple of str, not {}" ,
564- o. class( ) ,
565- )
566- } ,
567- vm,
568- )
569- } else {
570- Ok ( false )
571- }
547+ self . value . as_str ( ) . py_startsendswith (
548+ prefix,
549+ start,
550+ end,
551+ "startswith" ,
552+ "str" ,
553+ |s, x : & PyStringRef | s. starts_with ( x. as_str ( ) ) ,
554+ vm,
555+ )
572556 }
573557
574558 #[ pymethod]
@@ -1724,41 +1708,6 @@ impl PySliceableSequence for String {
17241708 }
17251709}
17261710
1727- pub trait StringRange {
1728- fn is_normal ( & self ) -> bool ;
1729- }
1730-
1731- impl StringRange for std:: ops:: Range < usize > {
1732- fn is_normal ( & self ) -> bool {
1733- self . start <= self . end
1734- }
1735- }
1736-
1737- // help get optional string indices
1738- pub fn adjust_indices (
1739- start : OptionalArg < Option < isize > > ,
1740- end : OptionalArg < Option < isize > > ,
1741- len : usize ,
1742- ) -> std:: ops:: Range < usize > {
1743- let mut start = start. flat_option ( ) . unwrap_or ( 0 ) ;
1744- let mut end = end. flat_option ( ) . unwrap_or ( len as isize ) ;
1745- if end > len as isize {
1746- end = len as isize ;
1747- } else if end < 0 {
1748- end += len as isize ;
1749- if end < 0 {
1750- end = 0 ;
1751- }
1752- }
1753- if start < 0 {
1754- start += len as isize ;
1755- if start < 0 {
1756- start = 0 ;
1757- }
1758- }
1759- start as usize ..end as usize
1760- }
1761-
17621711// According to python following categories aren't printable:
17631712// * Cc (Other, Control)
17641713// * Cf (Other, Format)
@@ -1851,6 +1800,14 @@ mod tests {
18511800}
18521801
18531802impl PyCommonString < ' _ , char > for str {
1803+ fn get_slice ( & self , range : std:: ops:: Range < usize > ) -> & Self {
1804+ & self [ range]
1805+ }
1806+
1807+ fn len ( & self ) -> usize {
1808+ Self :: len ( self )
1809+ }
1810+
18541811 fn py_split_whitespace < F > ( & self , maxsplit : isize , convert : F ) -> Vec < PyObjectRef >
18551812 where
18561813 F : Fn ( & Self ) -> PyObjectRef ,
0 commit comments