@@ -49,6 +49,8 @@ use std::collections::TryReserveError;
49
49
use std:: string:: String ;
50
50
use std:: vec:: Vec ;
51
51
52
+ use bstr:: ByteSlice ;
53
+
52
54
mod core_char;
53
55
mod core_str;
54
56
@@ -864,49 +866,27 @@ impl Wtf8 {
864
866
}
865
867
866
868
pub fn split ( & self , pat : & Wtf8 ) -> impl Iterator < Item = & Self > {
867
- self . splitn ( usize:: MAX , pat)
869
+ self . as_bytes ( )
870
+ . split_str ( pat)
871
+ . map ( |w| unsafe { Wtf8 :: from_bytes_unchecked ( w) } )
868
872
}
869
873
870
874
pub fn splitn ( & self , n : usize , pat : & Wtf8 ) -> impl Iterator < Item = & Self > {
871
- let ( haystack, needle) = ( self . as_bytes ( ) , pat. as_bytes ( ) ) ;
872
- if n == 0 {
873
- return None . into_iter ( ) . flatten ( ) ;
874
- }
875
- let mut prev_idx = Some ( 0 ) ;
876
- let mut iter = memchr:: memmem:: find_iter ( haystack, needle) . take ( n - 1 ) ;
877
- Some ( std:: iter:: from_fn ( move || {
878
- prev_idx. map ( |prev| {
879
- let idx = iter. next ( ) ;
880
- let chunk = & haystack[ prev..idx. unwrap_or ( haystack. len ( ) ) ] ;
881
- prev_idx = idx. map ( |i| i + needle. len ( ) ) ;
882
- unsafe { Wtf8 :: from_bytes_unchecked ( chunk) }
883
- } )
884
- } ) )
885
- . into_iter ( )
886
- . flatten ( )
875
+ self . as_bytes ( )
876
+ . splitn_str ( n, pat)
877
+ . map ( |w| unsafe { Wtf8 :: from_bytes_unchecked ( w) } )
887
878
}
888
879
889
880
pub fn rsplit ( & self , pat : & Wtf8 ) -> impl Iterator < Item = & Self > {
890
- self . rsplitn ( usize:: MAX , pat)
881
+ self . as_bytes ( )
882
+ . rsplit_str ( pat)
883
+ . map ( |w| unsafe { Wtf8 :: from_bytes_unchecked ( w) } )
891
884
}
892
885
893
886
pub fn rsplitn ( & self , n : usize , pat : & Wtf8 ) -> impl Iterator < Item = & Self > {
894
- let ( haystack, needle) = ( self . as_bytes ( ) , pat. as_bytes ( ) ) ;
895
- if n == 0 {
896
- return None . into_iter ( ) . flatten ( ) ;
897
- }
898
- let mut prev_idx = Some ( haystack. len ( ) ) ;
899
- let mut iter = memchr:: memmem:: rfind_iter ( haystack, needle) . take ( n - 1 ) ;
900
- Some ( std:: iter:: from_fn ( move || {
901
- prev_idx. map ( |prev| {
902
- let idx = iter. next ( ) ;
903
- let chunk = & haystack[ idx. map_or ( 0 , |i| i + needle. len ( ) ) ..prev] ;
904
- prev_idx = idx;
905
- unsafe { Wtf8 :: from_bytes_unchecked ( chunk) }
906
- } )
907
- } ) )
908
- . into_iter ( )
909
- . flatten ( )
887
+ self . as_bytes ( )
888
+ . rsplitn_str ( n, pat)
889
+ . map ( |w| unsafe { Wtf8 :: from_bytes_unchecked ( w) } )
910
890
}
911
891
912
892
pub fn trim_start_matches ( & self , f : impl Fn ( CodePoint ) -> bool ) -> & Self {
@@ -980,6 +960,12 @@ impl AsRef<Wtf8> for str {
980
960
}
981
961
}
982
962
963
+ impl AsRef < [ u8 ] > for Wtf8 {
964
+ fn as_ref ( & self ) -> & [ u8 ] {
965
+ self . as_bytes ( )
966
+ }
967
+ }
968
+
983
969
/// Returns a slice of the given string for the byte range \[`begin`..`end`).
984
970
///
985
971
/// # Panics
0 commit comments