@@ -717,14 +717,14 @@ impl<'a, P: Pattern<'a>> SplitInternal<'a, P> {
717717 }
718718
719719 #[ inline]
720- fn as_str ( & self ) -> & ' a str {
720+ fn remainder ( & self ) -> Option < & ' a str > {
721721 // `Self::get_end` doesn't change `self.start`
722722 if self . finished {
723- return "" ;
723+ return None ;
724724 }
725725
726726 // SAFETY: `self.start` and `self.end` always lie on unicode boundaries.
727- unsafe { self . matcher . haystack ( ) . get_unchecked ( self . start ..self . end ) }
727+ Some ( unsafe { self . matcher . haystack ( ) . get_unchecked ( self . start ..self . end ) } )
728728 }
729729}
730730
@@ -747,44 +747,48 @@ generate_pattern_iterators! {
747747}
748748
749749impl < ' a , P : Pattern < ' a > > Split < ' a , P > {
750- /// Returns remainder of the split string
750+ /// Returns remainder of the split string.
751+ ///
752+ /// If the iterator is empty, returns `None`.
751753 ///
752754 /// # Examples
753755 ///
754756 /// ```
755- /// #![feature(str_split_as_str )]
757+ /// #![feature(str_split_remainder )]
756758 /// let mut split = "Mary had a little lamb".split(' ');
757- /// assert_eq!(split.as_str (), "Mary had a little lamb");
759+ /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") );
758760 /// split.next();
759- /// assert_eq!(split.as_str (), "had a little lamb");
761+ /// assert_eq!(split.remainder (), Some( "had a little lamb") );
760762 /// split.by_ref().for_each(drop);
761- /// assert_eq!(split.as_str (), "" );
763+ /// assert_eq!(split.remainder (), None );
762764 /// ```
763765 #[ inline]
764- #[ unstable( feature = "str_split_as_str " , issue = "77998" ) ]
765- pub fn as_str ( & self ) -> & ' a str {
766- self . 0 . as_str ( )
766+ #[ unstable( feature = "str_split_remainder " , issue = "77998" ) ]
767+ pub fn remainder ( & self ) -> Option < & ' a str > {
768+ self . 0 . remainder ( )
767769 }
768770}
769771
770772impl < ' a , P : Pattern < ' a > > RSplit < ' a , P > {
771- /// Returns remainder of the split string
773+ /// Returns remainder of the split string.
774+ ///
775+ /// If the iterator is empty, returns `None`.
772776 ///
773777 /// # Examples
774778 ///
775779 /// ```
776- /// #![feature(str_split_as_str )]
780+ /// #![feature(str_split_remainder )]
777781 /// let mut split = "Mary had a little lamb".rsplit(' ');
778- /// assert_eq!(split.as_str (), "Mary had a little lamb");
782+ /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") );
779783 /// split.next();
780- /// assert_eq!(split.as_str (), "Mary had a little");
784+ /// assert_eq!(split.remainder (), Some( "Mary had a little") );
781785 /// split.by_ref().for_each(drop);
782- /// assert_eq!(split.as_str (), "" );
786+ /// assert_eq!(split.remainder (), None );
783787 /// ```
784788 #[ inline]
785- #[ unstable( feature = "str_split_as_str " , issue = "77998" ) ]
786- pub fn as_str ( & self ) -> & ' a str {
787- self . 0 . as_str ( )
789+ #[ unstable( feature = "str_split_remainder " , issue = "77998" ) ]
790+ pub fn remainder ( & self ) -> Option < & ' a str > {
791+ self . 0 . remainder ( )
788792 }
789793}
790794
@@ -807,44 +811,48 @@ generate_pattern_iterators! {
807811}
808812
809813impl < ' a , P : Pattern < ' a > > SplitTerminator < ' a , P > {
810- /// Returns remainder of the split string
814+ /// Returns remainder of the split string.
815+ ///
816+ /// If the iterator is empty, returns `None`.
811817 ///
812818 /// # Examples
813819 ///
814820 /// ```
815- /// #![feature(str_split_as_str )]
821+ /// #![feature(str_split_remainder )]
816822 /// let mut split = "A..B..".split_terminator('.');
817- /// assert_eq!(split.as_str (), "A..B..");
823+ /// assert_eq!(split.remainder (), Some( "A..B..") );
818824 /// split.next();
819- /// assert_eq!(split.as_str (), ".B..");
825+ /// assert_eq!(split.remainder (), Some( ".B..") );
820826 /// split.by_ref().for_each(drop);
821- /// assert_eq!(split.as_str (), "" );
827+ /// assert_eq!(split.remainder (), None );
822828 /// ```
823829 #[ inline]
824- #[ unstable( feature = "str_split_as_str " , issue = "77998" ) ]
825- pub fn as_str ( & self ) -> & ' a str {
826- self . 0 . as_str ( )
830+ #[ unstable( feature = "str_split_remainder " , issue = "77998" ) ]
831+ pub fn remainder ( & self ) -> Option < & ' a str > {
832+ self . 0 . remainder ( )
827833 }
828834}
829835
830836impl < ' a , P : Pattern < ' a > > RSplitTerminator < ' a , P > {
831- /// Returns remainder of the split string
837+ /// Returns remainder of the split string.
838+ ///
839+ /// If the iterator is empty, returns `None`.
832840 ///
833841 /// # Examples
834842 ///
835843 /// ```
836- /// #![feature(str_split_as_str )]
844+ /// #![feature(str_split_remainder )]
837845 /// let mut split = "A..B..".rsplit_terminator('.');
838- /// assert_eq!(split.as_str (), "A..B..");
846+ /// assert_eq!(split.remainder (), Some( "A..B..") );
839847 /// split.next();
840- /// assert_eq!(split.as_str (), "A..B");
848+ /// assert_eq!(split.remainder (), Some( "A..B") );
841849 /// split.by_ref().for_each(drop);
842- /// assert_eq!(split.as_str (), "" );
850+ /// assert_eq!(split.remainder (), None );
843851 /// ```
844852 #[ inline]
845- #[ unstable( feature = "str_split_as_str " , issue = "77998" ) ]
846- pub fn as_str ( & self ) -> & ' a str {
847- self . 0 . as_str ( )
853+ #[ unstable( feature = "str_split_remainder " , issue = "77998" ) ]
854+ pub fn remainder ( & self ) -> Option < & ' a str > {
855+ self . 0 . remainder ( )
848856 }
849857}
850858
@@ -906,8 +914,8 @@ impl<'a, P: Pattern<'a>> SplitNInternal<'a, P> {
906914 }
907915
908916 #[ inline]
909- fn as_str ( & self ) -> & ' a str {
910- self . iter . as_str ( )
917+ fn remainder ( & self ) -> Option < & ' a str > {
918+ self . iter . remainder ( )
911919 }
912920}
913921
@@ -930,44 +938,48 @@ generate_pattern_iterators! {
930938}
931939
932940impl < ' a , P : Pattern < ' a > > SplitN < ' a , P > {
933- /// Returns remainder of the split string
941+ /// Returns remainder of the split string.
942+ ///
943+ /// If the iterator is empty, returns `None`.
934944 ///
935945 /// # Examples
936946 ///
937947 /// ```
938- /// #![feature(str_split_as_str )]
948+ /// #![feature(str_split_remainder )]
939949 /// let mut split = "Mary had a little lamb".splitn(3, ' ');
940- /// assert_eq!(split.as_str (), "Mary had a little lamb");
950+ /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") );
941951 /// split.next();
942- /// assert_eq!(split.as_str (), "had a little lamb");
952+ /// assert_eq!(split.remainder (), Some( "had a little lamb") );
943953 /// split.by_ref().for_each(drop);
944- /// assert_eq!(split.as_str (), "" );
954+ /// assert_eq!(split.remainder (), None );
945955 /// ```
946956 #[ inline]
947- #[ unstable( feature = "str_split_as_str " , issue = "77998" ) ]
948- pub fn as_str ( & self ) -> & ' a str {
949- self . 0 . as_str ( )
957+ #[ unstable( feature = "str_split_remainder " , issue = "77998" ) ]
958+ pub fn remainder ( & self ) -> Option < & ' a str > {
959+ self . 0 . remainder ( )
950960 }
951961}
952962
953963impl < ' a , P : Pattern < ' a > > RSplitN < ' a , P > {
954- /// Returns remainder of the split string
964+ /// Returns remainder of the split string.
965+ ///
966+ /// If the iterator is empty, returns `None`.
955967 ///
956968 /// # Examples
957969 ///
958970 /// ```
959- /// #![feature(str_split_as_str )]
971+ /// #![feature(str_split_remainder )]
960972 /// let mut split = "Mary had a little lamb".rsplitn(3, ' ');
961- /// assert_eq!(split.as_str (), "Mary had a little lamb");
973+ /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") );
962974 /// split.next();
963- /// assert_eq!(split.as_str (), "Mary had a little");
975+ /// assert_eq!(split.remainder (), Some( "Mary had a little") );
964976 /// split.by_ref().for_each(drop);
965- /// assert_eq!(split.as_str (), "" );
977+ /// assert_eq!(split.remainder (), None );
966978 /// ```
967979 #[ inline]
968- #[ unstable( feature = "str_split_as_str " , issue = "77998" ) ]
969- pub fn as_str ( & self ) -> & ' a str {
970- self . 0 . as_str ( )
980+ #[ unstable( feature = "str_split_remainder " , issue = "77998" ) ]
981+ pub fn remainder ( & self ) -> Option < & ' a str > {
982+ self . 0 . remainder ( )
971983 }
972984}
973985
@@ -1240,22 +1252,22 @@ impl<'a> SplitWhitespace<'a> {
12401252 /// # Examples
12411253 ///
12421254 /// ```
1243- /// #![feature(str_split_whitespace_as_str )]
1255+ /// #![feature(str_split_whitespace_remainder )]
12441256 ///
12451257 /// let mut split = "Mary had a little lamb".split_whitespace();
1246- /// assert_eq!(split.as_str (), "Mary had a little lamb");
1258+ /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") );
12471259 ///
12481260 /// split.next();
1249- /// assert_eq!(split.as_str (), "had a little lamb");
1261+ /// assert_eq!(split.remainder (), Some( "had a little lamb") );
12501262 ///
12511263 /// split.by_ref().for_each(drop);
1252- /// assert_eq!(split.as_str (), "" );
1264+ /// assert_eq!(split.remainder (), None );
12531265 /// ```
12541266 #[ inline]
12551267 #[ must_use]
1256- #[ unstable( feature = "str_split_whitespace_as_str " , issue = "77998" ) ]
1257- pub fn as_str ( & self ) -> & ' a str {
1258- self . inner . iter . as_str ( )
1268+ #[ unstable( feature = "str_split_whitespace_remainder " , issue = "77998" ) ]
1269+ pub fn remainder ( & self ) -> Option < & ' a str > {
1270+ self . inner . iter . remainder ( )
12591271 }
12601272}
12611273
@@ -1291,32 +1303,34 @@ impl<'a> DoubleEndedIterator for SplitAsciiWhitespace<'a> {
12911303impl FusedIterator for SplitAsciiWhitespace < ' _ > { }
12921304
12931305impl < ' a > SplitAsciiWhitespace < ' a > {
1294- /// Returns remainder of the split string
1306+ /// Returns remainder of the split string.
1307+ ///
1308+ /// If the iterator is empty, returns `None`.
12951309 ///
12961310 /// # Examples
12971311 ///
12981312 /// ```
1299- /// #![feature(str_split_whitespace_as_str )]
1313+ /// #![feature(str_split_whitespace_remainder )]
13001314 ///
13011315 /// let mut split = "Mary had a little lamb".split_ascii_whitespace();
1302- /// assert_eq!(split.as_str (), "Mary had a little lamb");
1316+ /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") );
13031317 ///
13041318 /// split.next();
1305- /// assert_eq!(split.as_str (), "had a little lamb");
1319+ /// assert_eq!(split.remainder (), Some( "had a little lamb") );
13061320 ///
13071321 /// split.by_ref().for_each(drop);
1308- /// assert_eq!(split.as_str (), "" );
1322+ /// assert_eq!(split.remainder (), None );
13091323 /// ```
13101324 #[ inline]
13111325 #[ must_use]
1312- #[ unstable( feature = "str_split_whitespace_as_str " , issue = "77998" ) ]
1313- pub fn as_str ( & self ) -> & ' a str {
1326+ #[ unstable( feature = "str_split_whitespace_remainder " , issue = "77998" ) ]
1327+ pub fn remainder ( & self ) -> Option < & ' a str > {
13141328 if self . inner . iter . iter . finished {
1315- return "" ;
1329+ return None ;
13161330 }
13171331
13181332 // SAFETY: Slice is created from str.
1319- unsafe { crate :: str:: from_utf8_unchecked ( & self . inner . iter . iter . v ) }
1333+ Some ( unsafe { crate :: str:: from_utf8_unchecked ( & self . inner . iter . iter . v ) } )
13201334 }
13211335}
13221336
@@ -1359,23 +1373,25 @@ impl<'a, P: Pattern<'a, Searcher: ReverseSearcher<'a>>> DoubleEndedIterator
13591373impl < ' a , P : Pattern < ' a > > FusedIterator for SplitInclusive < ' a , P > { }
13601374
13611375impl < ' a , P : Pattern < ' a > > SplitInclusive < ' a , P > {
1362- /// Returns remainder of the split string
1376+ /// Returns remainder of the split string.
1377+ ///
1378+ /// If the iterator is empty, returns `None`.
13631379 ///
13641380 /// # Examples
13651381 ///
13661382 /// ```
1367- /// #![feature(str_split_inclusive_as_str )]
1383+ /// #![feature(str_split_inclusive_remainder )]
13681384 /// let mut split = "Mary had a little lamb".split_inclusive(' ');
1369- /// assert_eq!(split.as_str (), "Mary had a little lamb");
1385+ /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") );
13701386 /// split.next();
1371- /// assert_eq!(split.as_str (), "had a little lamb");
1387+ /// assert_eq!(split.remainder (), Some( "had a little lamb") );
13721388 /// split.by_ref().for_each(drop);
1373- /// assert_eq!(split.as_str (), "" );
1389+ /// assert_eq!(split.remainder (), None );
13741390 /// ```
13751391 #[ inline]
1376- #[ unstable( feature = "str_split_inclusive_as_str " , issue = "77998" ) ]
1377- pub fn as_str ( & self ) -> & ' a str {
1378- self . 0 . as_str ( )
1392+ #[ unstable( feature = "str_split_inclusive_remainder " , issue = "77998" ) ]
1393+ pub fn remainder ( & self ) -> Option < & ' a str > {
1394+ self . 0 . remainder ( )
13791395 }
13801396}
13811397
0 commit comments