}
}
+ /// Returns a mutable slice of the given string from the byte range
+ /// [`begin`..`end`).
+ #[stable(feature = "derefmut_for_string", since = "1.2.0")]
+ impl ops::IndexMut<ops::Range<usize>> for str {
+ #[inline]
+ fn index_mut(&mut self, index: ops::Range<usize>) -> &mut str {
+ // is_char_boundary checks that the index is in [0, .len()]
+ if index.start <= index.end &&
+ self.is_char_boundary(index.start) &&
+ self.is_char_boundary(index.end) {
+ unsafe { self.slice_mut_unchecked(index.start, index.end) }
+ } else {
+ super::slice_error_fail(self, index.start, index.end)
+ }
+ }
+ }
+
/// Returns a slice of the string from the beginning to byte
/// `end`.
///
}
}
+ /// Returns a mutable slice of the string from the beginning to byte
+ /// `end`.
+ #[stable(feature = "derefmut_for_string", since = "1.2.0")]
+ impl ops::IndexMut<ops::RangeTo<usize>> for str {
+ #[inline]
+ fn index_mut(&mut self, index: ops::RangeTo<usize>) -> &mut str {
+ // is_char_boundary checks that the index is in [0, .len()]
+ if self.is_char_boundary(index.end) {
+ unsafe { self.slice_mut_unchecked(0, index.end) }
+ } else {
+ super::slice_error_fail(self, 0, index.end)
+ }
+ }
+ }
+
/// Returns a slice of the string from `begin` to its end.
///
/// Equivalent to `self[begin .. self.len()]`.
}
}
+ /// Returns a slice of the string from `begin` to its end.
+ #[stable(feature = "derefmut_for_string", since = "1.2.0")]
+ impl ops::IndexMut<ops::RangeFrom<usize>> for str {
+ #[inline]
+ fn index_mut(&mut self, index: ops::RangeFrom<usize>) -> &mut str {
+ // is_char_boundary checks that the index is in [0, .len()]
+ if self.is_char_boundary(index.start) {
+ let len = self.len();
+ unsafe { self.slice_mut_unchecked(index.start, len) }
+ } else {
+ super::slice_error_fail(self, index.start, self.len())
+ }
+ }
+ }
+
#[stable(feature = "rust1", since = "1.0.0")]
impl ops::Index<ops::RangeFull> for str {
type Output = str;
self
}
}
+
+ #[stable(feature = "derefmut_for_string", since = "1.2.0")]
+ impl ops::IndexMut<ops::RangeFull> for str {
+ #[inline]
+ fn index_mut(&mut self, _index: ops::RangeFull) -> &mut str {
+ self
+ }
+ }
}
/// Methods for string slices
fn char_len(&self) -> usize;
fn slice_chars<'a>(&'a self, begin: usize, end: usize) -> &'a str;
unsafe fn slice_unchecked<'a>(&'a self, begin: usize, end: usize) -> &'a str;
+ unsafe fn slice_mut_unchecked<'a>(&'a mut self, begin: usize, end: usize) -> &'a mut str;
fn starts_with<'a, P: Pattern<'a>>(&'a self, pat: P) -> bool;
fn ends_with<'a, P: Pattern<'a>>(&'a self, pat: P) -> bool
where P::Searcher: ReverseSearcher<'a>;
})
}
+ #[inline]
+ unsafe fn slice_mut_unchecked(&mut self, begin: usize, end: usize) -> &mut str {
+ mem::transmute(Slice {
+ data: self.as_ptr().offset(begin as isize),
+ len: end - begin,
+ })
+ }
+
#[inline]
fn starts_with<'a, P: Pattern<'a>>(&'a self, pat: P) -> bool {
pat.is_prefix_of(self)