File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -1324,6 +1324,10 @@ impl PyCommonString<u8> for [u8] {
13241324 & self [ range]
13251325 }
13261326
1327+ fn get_chars < ' a > ( & ' a self , range : std:: ops:: Range < usize > ) -> & ' a Self {
1328+ & self [ range]
1329+ }
1330+
13271331 fn is_empty ( & self ) -> bool {
13281332 Self :: is_empty ( self )
13291333 }
Original file line number Diff line number Diff line change @@ -1745,6 +1745,19 @@ impl PyCommonString<char> for str {
17451745 & self [ range]
17461746 }
17471747
1748+ fn get_chars < ' a > ( & ' a self , range : std:: ops:: Range < usize > ) -> & ' a Self {
1749+ let mut chars = self . chars ( ) ;
1750+ for _ in 0 ..range. start {
1751+ let _ = chars. next ( ) ;
1752+ }
1753+ let start = chars. as_str ( ) ;
1754+ for _ in range {
1755+ let _ = chars. next ( ) ;
1756+ }
1757+ let end = chars. as_str ( ) ;
1758+ & start[ ..start. len ( ) - end. len ( ) ]
1759+ }
1760+
17481761 fn is_empty ( & self ) -> bool {
17491762 Self :: is_empty ( self )
17501763 }
Original file line number Diff line number Diff line change @@ -118,6 +118,8 @@ pub trait PyCommonString<E> {
118118
119119 fn with_capacity ( capacity : usize ) -> Self :: Container ;
120120 fn get_bytes < ' a > ( & ' a self , range : std:: ops:: Range < usize > ) -> & ' a Self ;
121+ // FIXME: get_chars is expensive for str
122+ fn get_chars < ' a > ( & ' a self , range : std:: ops:: Range < usize > ) -> & ' a Self ;
121123 fn bytes_len ( & self ) -> usize ;
122124 fn chars_len ( & self ) -> usize ;
123125 fn is_empty ( & self ) -> bool ;
@@ -216,7 +218,7 @@ pub trait PyCommonString<E> {
216218 {
217219 if range. is_normal ( ) {
218220 let start = range. start ;
219- if let Some ( index) = find ( self . get_bytes ( range) , & needle) {
221+ if let Some ( index) = find ( self . get_chars ( range) , & needle) {
220222 return Some ( start + index) ;
221223 }
222224 }
@@ -229,7 +231,7 @@ pub trait PyCommonString<E> {
229231 F : Fn ( & Self , & Self ) -> usize ,
230232 {
231233 if range. is_normal ( ) {
232- count ( self . get_bytes ( range) , & needle)
234+ count ( self . get_chars ( range) , & needle)
233235 } else {
234236 0
235237 }
You can’t perform that action at this time.
0 commit comments