@@ -585,16 +585,17 @@ where
585585impl < ' a ,  P :  Pattern < ' a > >  SplitInternal < ' a ,  P >  { 
586586    #[ inline]  
587587    fn  get_end ( & mut  self )  -> Option < & ' a  str >  { 
588-         if  !self . finished  &&  ( self . allow_trailing_empty  ||  self . end  -  self . start  >  0 )   { 
588+         if  !self . finished  { 
589589            self . finished  = true ; 
590-             // SAFETY: `self.start` and `self.end` always lie on unicode boundaries. 
591-             unsafe  { 
592-                 let  string = self . matcher . haystack ( ) . get_unchecked ( self . start ..self . end ) ; 
593-                 Some ( string) 
590+ 
591+             if  self . allow_trailing_empty  || self . end  - self . start  > 0  { 
592+                 // SAFETY: `self.start` and `self.end` always lie on unicode boundaries. 
593+                 let  string = unsafe  {  self . matcher . haystack ( ) . get_unchecked ( self . start ..self . end )  } ; 
594+                 return  Some ( string) ; 
594595            } 
595-         }  else  { 
596-             None 
597596        } 
597+ 
598+         None 
598599    } 
599600
600601    #[ inline]  
@@ -716,14 +717,14 @@ impl<'a, P: Pattern<'a>> SplitInternal<'a, P> {
716717    } 
717718
718719    #[ inline]  
719-     fn  as_str ( & self )  -> & ' a  str  { 
720+     fn  remainder ( & self )  -> Option < & ' a  str >  { 
720721        // `Self::get_end` doesn't change `self.start` 
721722        if  self . finished  { 
722-             return  "" ; 
723+             return  None ; 
723724        } 
724725
725726        // SAFETY: `self.start` and `self.end` always lie on unicode boundaries. 
726-         unsafe  {  self . matcher . haystack ( ) . get_unchecked ( self . start ..self . end )  } 
727+         Some ( unsafe  {  self . matcher . haystack ( ) . get_unchecked ( self . start ..self . end )  } ) 
727728    } 
728729} 
729730
@@ -746,44 +747,48 @@ generate_pattern_iterators! {
746747} 
747748
748749impl < ' a ,  P :  Pattern < ' a > >  Split < ' a ,  P >  { 
749-     /// Returns remainder of the split string 
750+     /// Returns remainder of the split string. 
751+      /// 
752+      /// If the iterator is empty, returns `None`. 
750753     /// 
751754     /// # Examples 
752755     /// 
753756     /// ``` 
754-      /// #![feature(str_split_as_str )] 
757+      /// #![feature(str_split_remainder )] 
755758     /// let mut split = "Mary had a little lamb".split(' '); 
756-      /// assert_eq!(split.as_str (), "Mary had a little lamb"); 
759+      /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") ); 
757760     /// split.next(); 
758-      /// assert_eq!(split.as_str (), "had a little lamb"); 
761+      /// assert_eq!(split.remainder (), Some( "had a little lamb") ); 
759762     /// split.by_ref().for_each(drop); 
760-      /// assert_eq!(split.as_str (), "" ); 
763+      /// assert_eq!(split.remainder (), None ); 
761764     /// ``` 
762765     #[ inline]  
763-     #[ unstable( feature = "str_split_as_str " ,  issue = "77998" ) ]  
764-     pub  fn  as_str ( & self )  -> & ' a  str  { 
765-         self . 0 . as_str ( ) 
766+     #[ unstable( feature = "str_split_remainder " ,  issue = "77998" ) ]  
767+     pub  fn  remainder ( & self )  -> Option < & ' a  str >  { 
768+         self . 0 . remainder ( ) 
766769    } 
767770} 
768771
769772impl < ' a ,  P :  Pattern < ' a > >  RSplit < ' a ,  P >  { 
770-     /// Returns remainder of the split string 
773+     /// Returns remainder of the split string. 
774+      /// 
775+      /// If the iterator is empty, returns `None`. 
771776     /// 
772777     /// # Examples 
773778     /// 
774779     /// ``` 
775-      /// #![feature(str_split_as_str )] 
780+      /// #![feature(str_split_remainder )] 
776781     /// let mut split = "Mary had a little lamb".rsplit(' '); 
777-      /// assert_eq!(split.as_str (), "Mary had a little lamb"); 
782+      /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") ); 
778783     /// split.next(); 
779-      /// assert_eq!(split.as_str (), "Mary had a little"); 
784+      /// assert_eq!(split.remainder (), Some( "Mary had a little") ); 
780785     /// split.by_ref().for_each(drop); 
781-      /// assert_eq!(split.as_str (), "" ); 
786+      /// assert_eq!(split.remainder (), None ); 
782787     /// ``` 
783788     #[ inline]  
784-     #[ unstable( feature = "str_split_as_str " ,  issue = "77998" ) ]  
785-     pub  fn  as_str ( & self )  -> & ' a  str  { 
786-         self . 0 . as_str ( ) 
789+     #[ unstable( feature = "str_split_remainder " ,  issue = "77998" ) ]  
790+     pub  fn  remainder ( & self )  -> Option < & ' a  str >  { 
791+         self . 0 . remainder ( ) 
787792    } 
788793} 
789794
@@ -806,44 +811,48 @@ generate_pattern_iterators! {
806811} 
807812
808813impl < ' a ,  P :  Pattern < ' a > >  SplitTerminator < ' a ,  P >  { 
809-     /// Returns remainder of the split string 
814+     /// Returns remainder of the split string. 
815+      /// 
816+      /// If the iterator is empty, returns `None`. 
810817     /// 
811818     /// # Examples 
812819     /// 
813820     /// ``` 
814-      /// #![feature(str_split_as_str )] 
821+      /// #![feature(str_split_remainder )] 
815822     /// let mut split = "A..B..".split_terminator('.'); 
816-      /// assert_eq!(split.as_str (), "A..B.."); 
823+      /// assert_eq!(split.remainder (), Some( "A..B..") ); 
817824     /// split.next(); 
818-      /// assert_eq!(split.as_str (), ".B.."); 
825+      /// assert_eq!(split.remainder (), Some( ".B..") ); 
819826     /// split.by_ref().for_each(drop); 
820-      /// assert_eq!(split.as_str (), "" ); 
827+      /// assert_eq!(split.remainder (), None ); 
821828     /// ``` 
822829     #[ inline]  
823-     #[ unstable( feature = "str_split_as_str " ,  issue = "77998" ) ]  
824-     pub  fn  as_str ( & self )  -> & ' a  str  { 
825-         self . 0 . as_str ( ) 
830+     #[ unstable( feature = "str_split_remainder " ,  issue = "77998" ) ]  
831+     pub  fn  remainder ( & self )  -> Option < & ' a  str >  { 
832+         self . 0 . remainder ( ) 
826833    } 
827834} 
828835
829836impl < ' a ,  P :  Pattern < ' a > >  RSplitTerminator < ' a ,  P >  { 
830-     /// Returns remainder of the split string 
837+     /// Returns remainder of the split string. 
838+      /// 
839+      /// If the iterator is empty, returns `None`. 
831840     /// 
832841     /// # Examples 
833842     /// 
834843     /// ``` 
835-      /// #![feature(str_split_as_str )] 
844+      /// #![feature(str_split_remainder )] 
836845     /// let mut split = "A..B..".rsplit_terminator('.'); 
837-      /// assert_eq!(split.as_str (), "A..B.."); 
846+      /// assert_eq!(split.remainder (), Some( "A..B..") ); 
838847     /// split.next(); 
839-      /// assert_eq!(split.as_str (), "A..B"); 
848+      /// assert_eq!(split.remainder (), Some( "A..B") ); 
840849     /// split.by_ref().for_each(drop); 
841-      /// assert_eq!(split.as_str (), "" ); 
850+      /// assert_eq!(split.remainder (), None ); 
842851     /// ``` 
843852     #[ inline]  
844-     #[ unstable( feature = "str_split_as_str " ,  issue = "77998" ) ]  
845-     pub  fn  as_str ( & self )  -> & ' a  str  { 
846-         self . 0 . as_str ( ) 
853+     #[ unstable( feature = "str_split_remainder " ,  issue = "77998" ) ]  
854+     pub  fn  remainder ( & self )  -> Option < & ' a  str >  { 
855+         self . 0 . remainder ( ) 
847856    } 
848857} 
849858
@@ -905,8 +914,8 @@ impl<'a, P: Pattern<'a>> SplitNInternal<'a, P> {
905914    } 
906915
907916    #[ inline]  
908-     fn  as_str ( & self )  -> & ' a  str  { 
909-         self . iter . as_str ( ) 
917+     fn  remainder ( & self )  -> Option < & ' a  str >  { 
918+         self . iter . remainder ( ) 
910919    } 
911920} 
912921
@@ -929,44 +938,48 @@ generate_pattern_iterators! {
929938} 
930939
931940impl < ' a ,  P :  Pattern < ' a > >  SplitN < ' a ,  P >  { 
932-     /// Returns remainder of the split string 
941+     /// Returns remainder of the split string. 
942+      /// 
943+      /// If the iterator is empty, returns `None`. 
933944     /// 
934945     /// # Examples 
935946     /// 
936947     /// ``` 
937-      /// #![feature(str_split_as_str )] 
948+      /// #![feature(str_split_remainder )] 
938949     /// let mut split = "Mary had a little lamb".splitn(3, ' '); 
939-      /// assert_eq!(split.as_str (), "Mary had a little lamb"); 
950+      /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") ); 
940951     /// split.next(); 
941-      /// assert_eq!(split.as_str (), "had a little lamb"); 
952+      /// assert_eq!(split.remainder (), Some( "had a little lamb") ); 
942953     /// split.by_ref().for_each(drop); 
943-      /// assert_eq!(split.as_str (), "" ); 
954+      /// assert_eq!(split.remainder (), None ); 
944955     /// ``` 
945956     #[ inline]  
946-     #[ unstable( feature = "str_split_as_str " ,  issue = "77998" ) ]  
947-     pub  fn  as_str ( & self )  -> & ' a  str  { 
948-         self . 0 . as_str ( ) 
957+     #[ unstable( feature = "str_split_remainder " ,  issue = "77998" ) ]  
958+     pub  fn  remainder ( & self )  -> Option < & ' a  str >  { 
959+         self . 0 . remainder ( ) 
949960    } 
950961} 
951962
952963impl < ' a ,  P :  Pattern < ' a > >  RSplitN < ' a ,  P >  { 
953-     /// Returns remainder of the split string 
964+     /// Returns remainder of the split string. 
965+      /// 
966+      /// If the iterator is empty, returns `None`. 
954967     /// 
955968     /// # Examples 
956969     /// 
957970     /// ``` 
958-      /// #![feature(str_split_as_str )] 
971+      /// #![feature(str_split_remainder )] 
959972     /// let mut split = "Mary had a little lamb".rsplitn(3, ' '); 
960-      /// assert_eq!(split.as_str (), "Mary had a little lamb"); 
973+      /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") ); 
961974     /// split.next(); 
962-      /// assert_eq!(split.as_str (), "Mary had a little"); 
975+      /// assert_eq!(split.remainder (), Some( "Mary had a little") ); 
963976     /// split.by_ref().for_each(drop); 
964-      /// assert_eq!(split.as_str (), "" ); 
977+      /// assert_eq!(split.remainder (), None ); 
965978     /// ``` 
966979     #[ inline]  
967-     #[ unstable( feature = "str_split_as_str " ,  issue = "77998" ) ]  
968-     pub  fn  as_str ( & self )  -> & ' a  str  { 
969-         self . 0 . as_str ( ) 
980+     #[ unstable( feature = "str_split_remainder " ,  issue = "77998" ) ]  
981+     pub  fn  remainder ( & self )  -> Option < & ' a  str >  { 
982+         self . 0 . remainder ( ) 
970983    } 
971984} 
972985
@@ -1239,22 +1252,22 @@ impl<'a> SplitWhitespace<'a> {
12391252     /// # Examples 
12401253     /// 
12411254     /// ``` 
1242-      /// #![feature(str_split_whitespace_as_str )] 
1255+      /// #![feature(str_split_whitespace_remainder )] 
12431256     /// 
12441257     /// let mut split = "Mary had a little lamb".split_whitespace(); 
1245-      /// assert_eq!(split.as_str (), "Mary had a little lamb"); 
1258+      /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") ); 
12461259     /// 
12471260     /// split.next(); 
1248-      /// assert_eq!(split.as_str (), "had a little lamb"); 
1261+      /// assert_eq!(split.remainder (), Some( "had a little lamb") ); 
12491262     /// 
12501263     /// split.by_ref().for_each(drop); 
1251-      /// assert_eq!(split.as_str (), "" ); 
1264+      /// assert_eq!(split.remainder (), None ); 
12521265     /// ``` 
12531266     #[ inline]  
12541267    #[ must_use]  
1255-     #[ unstable( feature = "str_split_whitespace_as_str " ,  issue = "77998" ) ]  
1256-     pub  fn  as_str ( & self )  -> & ' a  str  { 
1257-         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 ( ) 
12581271    } 
12591272} 
12601273
@@ -1290,32 +1303,34 @@ impl<'a> DoubleEndedIterator for SplitAsciiWhitespace<'a> {
12901303impl  FusedIterator  for  SplitAsciiWhitespace < ' _ >  { } 
12911304
12921305impl < ' a >  SplitAsciiWhitespace < ' a >  { 
1293-     /// Returns remainder of the split string 
1306+     /// Returns remainder of the split string. 
1307+      /// 
1308+      /// If the iterator is empty, returns `None`. 
12941309     /// 
12951310     /// # Examples 
12961311     /// 
12971312     /// ``` 
1298-      /// #![feature(str_split_whitespace_as_str )] 
1313+      /// #![feature(str_split_whitespace_remainder )] 
12991314     /// 
13001315     /// let mut split = "Mary had a little lamb".split_ascii_whitespace(); 
1301-      /// assert_eq!(split.as_str (), "Mary had a little lamb"); 
1316+      /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") ); 
13021317     /// 
13031318     /// split.next(); 
1304-      /// assert_eq!(split.as_str (), "had a little lamb"); 
1319+      /// assert_eq!(split.remainder (), Some( "had a little lamb") ); 
13051320     /// 
13061321     /// split.by_ref().for_each(drop); 
1307-      /// assert_eq!(split.as_str (), "" ); 
1322+      /// assert_eq!(split.remainder (), None ); 
13081323     /// ``` 
13091324     #[ inline]  
13101325    #[ must_use]  
1311-     #[ unstable( feature = "str_split_whitespace_as_str " ,  issue = "77998" ) ]  
1312-     pub  fn  as_str ( & self )  -> & ' a  str  { 
1326+     #[ unstable( feature = "str_split_whitespace_remainder " ,  issue = "77998" ) ]  
1327+     pub  fn  remainder ( & self )  -> Option < & ' a  str >  { 
13131328        if  self . inner . iter . iter . finished  { 
1314-             return  "" ; 
1329+             return  None ; 
13151330        } 
13161331
13171332        // SAFETY: Slice is created from str. 
1318-         unsafe  {  crate :: str:: from_utf8_unchecked ( & self . inner . iter . iter . v )  } 
1333+         Some ( unsafe  {  crate :: str:: from_utf8_unchecked ( & self . inner . iter . iter . v )  } ) 
13191334    } 
13201335} 
13211336
@@ -1358,23 +1373,25 @@ impl<'a, P: Pattern<'a, Searcher: ReverseSearcher<'a>>> DoubleEndedIterator
13581373impl < ' a ,  P :  Pattern < ' a > >  FusedIterator  for  SplitInclusive < ' a ,  P >  { } 
13591374
13601375impl < ' a ,  P :  Pattern < ' a > >  SplitInclusive < ' a ,  P >  { 
1361-     /// Returns remainder of the split string 
1376+     /// Returns remainder of the split string. 
1377+      /// 
1378+      /// If the iterator is empty, returns `None`. 
13621379     /// 
13631380     /// # Examples 
13641381     /// 
13651382     /// ``` 
1366-      /// #![feature(str_split_inclusive_as_str )] 
1383+      /// #![feature(str_split_inclusive_remainder )] 
13671384     /// let mut split = "Mary had a little lamb".split_inclusive(' '); 
1368-      /// assert_eq!(split.as_str (), "Mary had a little lamb"); 
1385+      /// assert_eq!(split.remainder (), Some( "Mary had a little lamb") ); 
13691386     /// split.next(); 
1370-      /// assert_eq!(split.as_str (), "had a little lamb"); 
1387+      /// assert_eq!(split.remainder (), Some( "had a little lamb") ); 
13711388     /// split.by_ref().for_each(drop); 
1372-      /// assert_eq!(split.as_str (), "" ); 
1389+      /// assert_eq!(split.remainder (), None ); 
13731390     /// ``` 
13741391     #[ inline]  
1375-     #[ unstable( feature = "str_split_inclusive_as_str " ,  issue = "77998" ) ]  
1376-     pub  fn  as_str ( & self )  -> & ' a  str  { 
1377-         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 ( ) 
13781395    } 
13791396} 
13801397
0 commit comments