@@ -671,24 +671,25 @@ impl String {
671
671
self . vec . clear ( )
672
672
}
673
673
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.
676
677
///
677
678
/// # Example
678
679
///
679
680
/// ```
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();
682
683
/// assert_eq!(s, "Hello !");
683
- /// assert_eq!(s2, "World ");
684
+ /// assert_eq!(s2, "Wörld ");
684
685
/// ```
685
686
///
686
687
/// # Panics
687
688
///
688
689
/// Panics if the range is decreasing, if the upper bound is larger than the
689
690
/// length of the String, or if the start and the end of the range don't lie on
690
691
/// 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 > {
692
693
range. drain ( self )
693
694
}
694
695
}
@@ -697,19 +698,19 @@ impl String {
697
698
///
698
699
/// See the documentation of `String::drain`.
699
700
pub trait DrainRange {
700
- fn drain < ' a > ( & self , s : & ' a mut String ) -> CharDrain < ' a > ;
701
+ fn drain < ' a > ( & self , s : & ' a mut String ) -> Drain < ' a > ;
701
702
}
702
703
703
704
impl 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 > {
705
706
assert ! ( self . start <= self . end, "Range not increasing" ) ;
706
707
assert ! ( self . end <= s. len( ) , "Range out of bounds" ) ;
707
708
unsafe {
708
709
let slice = mem:: transmute :: < & str , & ' static str > ( & s[ self . start ..self . end ] ) ;
709
710
let tail = s. len ( ) - self . end ;
710
711
s. as_mut_vec ( ) . set_len ( tail + self . start ) ;
711
712
let ptr = s. as_mut_vec ( ) . as_mut_ptr ( ) ;
712
- CharDrain {
713
+ Drain {
713
714
tail : tail,
714
715
start : ptr. offset ( self . start as isize ) ,
715
716
end : ptr. offset ( self . end as isize ) ,
@@ -720,43 +721,43 @@ impl DrainRange for Range<usize> {
720
721
}
721
722
722
723
impl 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 > {
724
725
assert ! ( self . start <= s. len( ) , "Range out of bounds" ) ;
725
726
( self . start ..s. len ( ) ) . drain ( s)
726
727
}
727
728
}
728
729
729
730
impl 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 > {
731
732
( 0 ..self . end ) . drain ( s)
732
733
}
733
734
}
734
735
735
736
impl 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 > {
737
738
( 0 ..s. len ( ) ) . drain ( s)
738
739
}
739
740
}
740
741
741
742
impl 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 > {
743
744
( * self ..* self +1 ) . drain ( s)
744
745
}
745
746
}
746
747
747
748
/// An iterator that drains part of string.
748
749
#[ unsafe_no_drop_flag]
749
- pub struct CharDrain < ' a > {
750
+ pub struct Drain < ' a > {
750
751
tail : usize ,
751
- start : * mut u8 ,
752
- end : * mut u8 ,
752
+ start : * const u8 ,
753
+ end : * const u8 ,
753
754
chars : Chars < ' a > ,
754
755
}
755
756
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 > { }
758
759
759
- impl < ' a > Iterator for CharDrain < ' a > {
760
+ impl < ' a > Iterator for Drain < ' a > {
760
761
type Item = char ;
761
762
762
763
#[ inline]
@@ -770,20 +771,20 @@ impl<'a> Iterator for CharDrain<'a> {
770
771
}
771
772
}
772
773
773
- impl < ' a > DoubleEndedIterator for CharDrain < ' a > {
774
+ impl < ' a > DoubleEndedIterator for Drain < ' a > {
774
775
#[ inline]
775
776
fn next_back ( & mut self ) -> Option < char > {
776
777
self . chars . next_back ( )
777
778
}
778
779
}
779
780
780
781
#[ unsafe_destructor]
781
- impl < ' a > Drop for CharDrain < ' a > {
782
+ impl < ' a > Drop for Drain < ' a > {
782
783
fn drop ( & mut self ) {
783
784
// self.start == null if drop has already been called, so we can use
784
785
// #[unsafe_no_drop_flag].
785
786
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 ) ; }
787
788
}
788
789
}
789
790
}
@@ -1561,9 +1562,9 @@ mod tests {
1561
1562
1562
1563
#[ test]
1563
1564
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 ( ) ;
1566
1567
assert_eq ! ( s, "Hello !" ) ;
1567
- assert_eq ! ( s2, "World " ) ;
1568
+ assert_eq ! ( s2, "Wörld " ) ;
1568
1569
}
1569
1570
}
0 commit comments