@@ -431,6 +431,22 @@ unsafe impl<'a> Searcher<'a> for CharSearcher<'a> {
431
431
}
432
432
#[ inline]
433
433
fn next_match ( & mut self ) -> Option < ( usize , usize ) > {
434
+ if self . utf8_size == 1 {
435
+ let find = |haystack : & [ u8 ] | {
436
+ if haystack. len ( ) < 64 {
437
+ haystack. iter ( ) . position ( |& x| x == self . utf8_encoded [ 0 ] )
438
+ } else {
439
+ memchr:: memchr ( self . utf8_encoded [ 0 ] , haystack)
440
+ }
441
+ } ;
442
+ return match find ( self . haystack . as_bytes ( ) . get ( self . finger ..self . finger_back ) ?) {
443
+ Some ( x) => {
444
+ self . finger += x + 1 ;
445
+ Some ( ( self . finger - 1 , self . finger ) )
446
+ }
447
+ None => None ,
448
+ } ;
449
+ }
434
450
loop {
435
451
// get the haystack after the last character found
436
452
let bytes = self . haystack . as_bytes ( ) . get ( self . finger ..self . finger_back ) ?;
@@ -498,6 +514,22 @@ unsafe impl<'a> ReverseSearcher<'a> for CharSearcher<'a> {
498
514
}
499
515
#[ inline]
500
516
fn next_match_back ( & mut self ) -> Option < ( usize , usize ) > {
517
+ if self . utf8_size == 1 {
518
+ let find = |haystack : & [ u8 ] | {
519
+ if haystack. len ( ) < 64 {
520
+ memchr:: memrchr ( self . utf8_encoded [ 0 ] , haystack)
521
+ } else {
522
+ haystack. iter ( ) . rposition ( |& x| x == self . utf8_encoded [ 0 ] )
523
+ }
524
+ } ;
525
+ return match find ( self . haystack . as_bytes ( ) . get ( self . finger ..self . finger_back ) ?) {
526
+ Some ( x) => {
527
+ self . finger_back = self . finger + x;
528
+ Some ( ( self . finger_back , self . finger_back + 1 ) )
529
+ }
530
+ None => None ,
531
+ } ;
532
+ }
501
533
let haystack = self . haystack . as_bytes ( ) ;
502
534
loop {
503
535
// get the haystack up to but not including the last character searched
0 commit comments