@@ -690,6 +690,17 @@ impl<'a, P: Pattern<'a>> SplitInternal<'a, P> {
690
690
} ,
691
691
}
692
692
}
693
+
694
+ #[ inline]
695
+ fn as_str ( & self ) -> & ' a str {
696
+ // `Self::get_end` doesn't change `self.start`
697
+ if self . finished {
698
+ return "" ;
699
+ }
700
+
701
+ // SAFETY: `self.start` and `self.end` always lie on unicode boundaries.
702
+ unsafe { self . matcher . haystack ( ) . get_unchecked ( self . start ..self . end ) }
703
+ }
693
704
}
694
705
695
706
generate_pattern_iterators ! {
@@ -710,6 +721,48 @@ generate_pattern_iterators! {
710
721
delegate double ended;
711
722
}
712
723
724
+ impl < ' a , P : Pattern < ' a > > Split < ' a , P > {
725
+ /// Returns remainder of the splitted string
726
+ ///
727
+ /// # Examples
728
+ ///
729
+ /// ```
730
+ /// #![feature(str_split_as_str)]
731
+ /// let mut split = "Mary had a little lamb".split(' ');
732
+ /// assert_eq!(split.as_str(), "Mary had a little lamb");
733
+ /// split.next();
734
+ /// assert_eq!(split.as_str(), "had a little lamb");
735
+ /// split.by_ref().for_each(drop);
736
+ /// assert_eq!(split.as_str(), "");
737
+ /// ```
738
+ #[ inline]
739
+ #[ unstable( feature = "str_split_as_str" , issue = "77998" ) ]
740
+ pub fn as_str ( & self ) -> & ' a str {
741
+ self . 0 . as_str ( )
742
+ }
743
+ }
744
+
745
+ impl < ' a , P : Pattern < ' a > > RSplit < ' a , P > {
746
+ /// Returns remainder of the splitted string
747
+ ///
748
+ /// # Examples
749
+ ///
750
+ /// ```
751
+ /// #![feature(str_split_as_str)]
752
+ /// let mut split = "Mary had a little lamb".rsplit(' ');
753
+ /// assert_eq!(split.as_str(), "Mary had a little lamb");
754
+ /// split.next();
755
+ /// assert_eq!(split.as_str(), "Mary had a little");
756
+ /// split.by_ref().for_each(drop);
757
+ /// assert_eq!(split.as_str(), "");
758
+ /// ```
759
+ #[ inline]
760
+ #[ unstable( feature = "str_split_as_str" , issue = "77998" ) ]
761
+ pub fn as_str ( & self ) -> & ' a str {
762
+ self . 0 . as_str ( )
763
+ }
764
+ }
765
+
713
766
generate_pattern_iterators ! {
714
767
forward:
715
768
/// Created with the method [`split_terminator`].
@@ -728,6 +781,48 @@ generate_pattern_iterators! {
728
781
delegate double ended;
729
782
}
730
783
784
+ impl < ' a , P : Pattern < ' a > > SplitTerminator < ' a , P > {
785
+ /// Returns remainder of the splitted string
786
+ ///
787
+ /// # Examples
788
+ ///
789
+ /// ```
790
+ /// #![feature(str_split_as_str)]
791
+ /// let mut split = "A..B..".split_terminator('.');
792
+ /// assert_eq!(split.as_str(), "A..B..");
793
+ /// split.next();
794
+ /// assert_eq!(split.as_str(), ".B..");
795
+ /// split.by_ref().for_each(drop);
796
+ /// assert_eq!(split.as_str(), "");
797
+ /// ```
798
+ #[ inline]
799
+ #[ unstable( feature = "str_split_as_str" , issue = "77998" ) ]
800
+ pub fn as_str ( & self ) -> & ' a str {
801
+ self . 0 . as_str ( )
802
+ }
803
+ }
804
+
805
+ impl < ' a , P : Pattern < ' a > > RSplitTerminator < ' a , P > {
806
+ /// Returns remainder of the splitted string
807
+ ///
808
+ /// # Examples
809
+ ///
810
+ /// ```
811
+ /// #![feature(str_split_as_str)]
812
+ /// let mut split = "A..B..".rsplit_terminator('.');
813
+ /// assert_eq!(split.as_str(), "A..B..");
814
+ /// split.next();
815
+ /// assert_eq!(split.as_str(), "A..B");
816
+ /// split.by_ref().for_each(drop);
817
+ /// assert_eq!(split.as_str(), "");
818
+ /// ```
819
+ #[ inline]
820
+ #[ unstable( feature = "str_split_as_str" , issue = "77998" ) ]
821
+ pub fn as_str ( & self ) -> & ' a str {
822
+ self . 0 . as_str ( )
823
+ }
824
+ }
825
+
731
826
derive_pattern_clone ! {
732
827
clone SplitNInternal
733
828
with |s| SplitNInternal { iter: s. iter. clone( ) , ..* s }
@@ -784,6 +879,11 @@ impl<'a, P: Pattern<'a>> SplitNInternal<'a, P> {
784
879
}
785
880
}
786
881
}
882
+
883
+ #[ inline]
884
+ fn as_str ( & self ) -> & ' a str {
885
+ self . iter . as_str ( )
886
+ }
787
887
}
788
888
789
889
generate_pattern_iterators ! {
@@ -804,6 +904,48 @@ generate_pattern_iterators! {
804
904
delegate single ended;
805
905
}
806
906
907
+ impl < ' a , P : Pattern < ' a > > SplitN < ' a , P > {
908
+ /// Returns remainder of the splitted string
909
+ ///
910
+ /// # Examples
911
+ ///
912
+ /// ```
913
+ /// #![feature(str_split_as_str)]
914
+ /// let mut split = "Mary had a little lamb".splitn(3, ' ');
915
+ /// assert_eq!(split.as_str(), "Mary had a little lamb");
916
+ /// split.next();
917
+ /// assert_eq!(split.as_str(), "had a little lamb");
918
+ /// split.by_ref().for_each(drop);
919
+ /// assert_eq!(split.as_str(), "");
920
+ /// ```
921
+ #[ inline]
922
+ #[ unstable( feature = "str_split_as_str" , issue = "77998" ) ]
923
+ pub fn as_str ( & self ) -> & ' a str {
924
+ self . 0 . as_str ( )
925
+ }
926
+ }
927
+
928
+ impl < ' a , P : Pattern < ' a > > RSplitN < ' a , P > {
929
+ /// Returns remainder of the splitted string
930
+ ///
931
+ /// # Examples
932
+ ///
933
+ /// ```
934
+ /// #![feature(str_split_as_str)]
935
+ /// let mut split = "Mary had a little lamb".rsplitn(3, ' ');
936
+ /// assert_eq!(split.as_str(), "Mary had a little lamb");
937
+ /// split.next();
938
+ /// assert_eq!(split.as_str(), "Mary had a little");
939
+ /// split.by_ref().for_each(drop);
940
+ /// assert_eq!(split.as_str(), "");
941
+ /// ```
942
+ #[ inline]
943
+ #[ unstable( feature = "str_split_as_str" , issue = "77998" ) ]
944
+ pub fn as_str ( & self ) -> & ' a str {
945
+ self . 0 . as_str ( )
946
+ }
947
+ }
948
+
807
949
derive_pattern_clone ! {
808
950
clone MatchIndicesInternal
809
951
with |s| MatchIndicesInternal ( s. 0 . clone( ) )
@@ -1134,6 +1276,28 @@ impl<'a, P: Pattern<'a, Searcher: ReverseSearcher<'a>>> DoubleEndedIterator
1134
1276
#[ unstable( feature = "split_inclusive" , issue = "72360" ) ]
1135
1277
impl < ' a , P : Pattern < ' a > > FusedIterator for SplitInclusive < ' a , P > { }
1136
1278
1279
+ impl < ' a , P : Pattern < ' a > > SplitInclusive < ' a , P > {
1280
+ /// Returns remainder of the splitted string
1281
+ ///
1282
+ /// # Examples
1283
+ ///
1284
+ /// ```
1285
+ /// #![feature(str_split_inclusive_as_str)]
1286
+ /// #![feature(split_inclusive)]
1287
+ /// let mut split = "Mary had a little lamb".split_inclusive(' ');
1288
+ /// assert_eq!(split.as_str(), "Mary had a little lamb");
1289
+ /// split.next();
1290
+ /// assert_eq!(split.as_str(), "had a little lamb");
1291
+ /// split.by_ref().for_each(drop);
1292
+ /// assert_eq!(split.as_str(), "");
1293
+ /// ```
1294
+ #[ inline]
1295
+ #[ unstable( feature = "str_split_inclusive_as_str" , issue = "77998" ) ]
1296
+ pub fn as_str ( & self ) -> & ' a str {
1297
+ self . 0 . as_str ( )
1298
+ }
1299
+ }
1300
+
1137
1301
/// An iterator of [`u16`] over the string encoded as UTF-16.
1138
1302
///
1139
1303
/// This struct is created by the [`encode_utf16`] method on [`str`].
0 commit comments