@@ -671,24 +671,25 @@ impl String {
671671 self . vec . clear ( )
672672 }
673673
674- /// Creates a draining iterator that clears the specified range in the String
675- /// and iterates over the characters contained in the range.
674+ /// Creates a draining iterator that clears the specified byte-range in the String
675+ /// and iterates over the characters contained in the range, backshifting the
676+ /// remaining bytes.
676677 ///
677678 /// # Example
678679 ///
679680 /// ```
680- /// let mut s = "Hello World !".to_string();
681- /// let s2: String = s.drain(6..11 ).collect();
681+ /// let mut s = "Hello Wörld !".to_string();
682+ /// let s2: String = s.drain(6..12 ).collect();
682683 /// assert_eq!(s, "Hello !");
683- /// assert_eq!(s2, "World ");
684+ /// assert_eq!(s2, "Wörld ");
684685 /// ```
685686 ///
686687 /// # Panics
687688 ///
688689 /// Panics if the range is decreasing, if the upper bound is larger than the
689690 /// length of the String, or if the start and the end of the range don't lie on
690691 /// character boundaries.
691- pub fn drain < ' a , T : DrainRange > ( & ' a mut self , range : T ) -> CharDrain < ' a > {
692+ pub fn drain < ' a , T : DrainRange > ( & ' a mut self , range : T ) -> Drain < ' a > {
692693 range. drain ( self )
693694 }
694695}
@@ -697,19 +698,19 @@ impl String {
697698///
698699/// See the documentation of `String::drain`.
699700pub trait DrainRange {
700- fn drain < ' a > ( & self , s : & ' a mut String ) -> CharDrain < ' a > ;
701+ fn drain < ' a > ( & self , s : & ' a mut String ) -> Drain < ' a > ;
701702}
702703
703704impl DrainRange for Range < usize > {
704- fn drain < ' a > ( & self , s : & ' a mut String ) -> CharDrain < ' a > {
705+ fn drain < ' a > ( & self , s : & ' a mut String ) -> Drain < ' a > {
705706 assert ! ( self . start <= self . end, "Range not increasing" ) ;
706707 assert ! ( self . end <= s. len( ) , "Range out of bounds" ) ;
707708 unsafe {
708709 let slice = mem:: transmute :: < & str , & ' static str > ( & s[ self . start ..self . end ] ) ;
709710 let tail = s. len ( ) - self . end ;
710711 s. as_mut_vec ( ) . set_len ( tail + self . start ) ;
711712 let ptr = s. as_mut_vec ( ) . as_mut_ptr ( ) ;
712- CharDrain {
713+ Drain {
713714 tail : tail,
714715 start : ptr. offset ( self . start as isize ) ,
715716 end : ptr. offset ( self . end as isize ) ,
@@ -720,43 +721,43 @@ impl DrainRange for Range<usize> {
720721}
721722
722723impl DrainRange for RangeFrom < usize > {
723- fn drain < ' a > ( & self , s : & ' a mut String ) -> CharDrain < ' a > {
724+ fn drain < ' a > ( & self , s : & ' a mut String ) -> Drain < ' a > {
724725 assert ! ( self . start <= s. len( ) , "Range out of bounds" ) ;
725726 ( self . start ..s. len ( ) ) . drain ( s)
726727 }
727728}
728729
729730impl DrainRange for RangeTo < usize > {
730- fn drain < ' a > ( & self , s : & ' a mut String ) -> CharDrain < ' a > {
731+ fn drain < ' a > ( & self , s : & ' a mut String ) -> Drain < ' a > {
731732 ( 0 ..self . end ) . drain ( s)
732733 }
733734}
734735
735736impl DrainRange for RangeFull {
736- fn drain < ' a > ( & self , s : & ' a mut String ) -> CharDrain < ' a > {
737+ fn drain < ' a > ( & self , s : & ' a mut String ) -> Drain < ' a > {
737738 ( 0 ..s. len ( ) ) . drain ( s)
738739 }
739740}
740741
741742impl DrainRange for usize {
742- fn drain < ' a > ( & self , s : & ' a mut String ) -> CharDrain < ' a > {
743+ fn drain < ' a > ( & self , s : & ' a mut String ) -> Drain < ' a > {
743744 ( * self ..* self +1 ) . drain ( s)
744745 }
745746}
746747
747748/// An iterator that drains part of string.
748749#[ unsafe_no_drop_flag]
749- pub struct CharDrain < ' a > {
750+ pub struct Drain < ' a > {
750751 tail : usize ,
751- start : * mut u8 ,
752- end : * mut u8 ,
752+ start : * const u8 ,
753+ end : * const u8 ,
753754 chars : Chars < ' a > ,
754755}
755756
756- unsafe impl < ' a > Sync for CharDrain < ' a > { }
757- unsafe impl < ' a > Send for CharDrain < ' a > { }
757+ unsafe impl < ' a > Sync for Drain < ' a > { }
758+ unsafe impl < ' a > Send for Drain < ' a > { }
758759
759- impl < ' a > Iterator for CharDrain < ' a > {
760+ impl < ' a > Iterator for Drain < ' a > {
760761 type Item = char ;
761762
762763 #[ inline]
@@ -770,20 +771,20 @@ impl<'a> Iterator for CharDrain<'a> {
770771 }
771772}
772773
773- impl < ' a > DoubleEndedIterator for CharDrain < ' a > {
774+ impl < ' a > DoubleEndedIterator for Drain < ' a > {
774775 #[ inline]
775776 fn next_back ( & mut self ) -> Option < char > {
776777 self . chars . next_back ( )
777778 }
778779}
779780
780781#[ unsafe_destructor]
781- impl < ' a > Drop for CharDrain < ' a > {
782+ impl < ' a > Drop for Drain < ' a > {
782783 fn drop ( & mut self ) {
783784 // self.start == null if drop has already been called, so we can use
784785 // #[unsafe_no_drop_flag].
785786 if !self . start . is_null ( ) {
786- unsafe { ptr:: copy ( self . start , self . end , self . tail ) ; }
787+ unsafe { ptr:: copy ( self . start as * mut _ , self . end , self . tail ) ; }
787788 }
788789 }
789790}
@@ -1561,9 +1562,9 @@ mod tests {
15611562
15621563 #[ test]
15631564 fn test_drain ( ) {
1564- let mut s = "Hello World !" . to_string ( ) ;
1565- let s2: String = s. drain ( 6 ..11 ) . collect ( ) ;
1565+ let mut s = "Hello Wörld !" . to_string ( ) ;
1566+ let s2: String = s. drain ( 6 ..12 ) . collect ( ) ;
15661567 assert_eq ! ( s, "Hello !" ) ;
1567- assert_eq ! ( s2, "World " ) ;
1568+ assert_eq ! ( s2, "Wörld " ) ;
15681569 }
15691570}
0 commit comments