Deprecate slicing methods in favor of notation
This commit deprecates `slice`, `slice_from`, `slice_to` and their mutable variants in favor of slice notation. The `as_slice` methods are left intact, for now. [breaking-change]
This commit is contained in:
parent
fba0bf63a9
commit
092ba6a856
5 changed files with 115 additions and 185 deletions
|
@ -169,29 +169,16 @@ pub trait SliceExt {
|
|||
#[unstable = "uncertain about this API approach"]
|
||||
fn move_from(&mut self, src: Vec<Self::Item>, start: uint, end: uint) -> uint;
|
||||
|
||||
/// Returns a subslice spanning the interval [`start`, `end`).
|
||||
///
|
||||
/// Panics when the end of the new slice lies beyond the end of the
|
||||
/// original slice (i.e. when `end > self.len()`) or when `start > end`.
|
||||
///
|
||||
/// Slicing with `start` equal to `end` yields an empty slice.
|
||||
#[unstable = "will be replaced by slice syntax"]
|
||||
/// Deprecated: use `&s[start .. end]` notation instead.
|
||||
#[deprecated = "use &s[start .. end] instead"]
|
||||
fn slice(&self, start: uint, end: uint) -> &[Self::Item];
|
||||
|
||||
/// Returns a subslice from `start` to the end of the slice.
|
||||
///
|
||||
/// Panics when `start` is strictly greater than the length of the original slice.
|
||||
///
|
||||
/// Slicing from `self.len()` yields an empty slice.
|
||||
#[unstable = "will be replaced by slice syntax"]
|
||||
/// Deprecated: use `&s[start..]` notation instead.
|
||||
#[deprecated = "use &s[start..] isntead"]
|
||||
fn slice_from(&self, start: uint) -> &[Self::Item];
|
||||
|
||||
/// Returns a subslice from the start of the slice to `end`.
|
||||
///
|
||||
/// Panics when `end` is strictly greater than the length of the original slice.
|
||||
///
|
||||
/// Slicing to `0` yields an empty slice.
|
||||
#[unstable = "will be replaced by slice syntax"]
|
||||
/// Deprecated: use `&s[..end]` notation instead.
|
||||
#[deprecated = "use &s[..end] instead"]
|
||||
fn slice_to(&self, end: uint) -> &[Self::Item];
|
||||
|
||||
/// Divides one slice into two at an index.
|
||||
|
@ -378,29 +365,16 @@ pub trait SliceExt {
|
|||
#[stable]
|
||||
fn as_mut_slice(&mut self) -> &mut [Self::Item];
|
||||
|
||||
/// Returns a mutable subslice spanning the interval [`start`, `end`).
|
||||
///
|
||||
/// Panics when the end of the new slice lies beyond the end of the
|
||||
/// original slice (i.e. when `end > self.len()`) or when `start > end`.
|
||||
///
|
||||
/// Slicing with `start` equal to `end` yields an empty slice.
|
||||
#[unstable = "will be replaced by slice syntax"]
|
||||
/// Deprecated: use `&mut s[start .. end]` instead.
|
||||
#[deprecated = "use &mut s[start .. end] instead"]
|
||||
fn slice_mut(&mut self, start: uint, end: uint) -> &mut [Self::Item];
|
||||
|
||||
/// Returns a mutable subslice from `start` to the end of the slice.
|
||||
///
|
||||
/// Panics when `start` is strictly greater than the length of the original slice.
|
||||
///
|
||||
/// Slicing from `self.len()` yields an empty slice.
|
||||
#[unstable = "will be replaced by slice syntax"]
|
||||
/// Deprecated: use `&mut s[start ..]` instead.
|
||||
#[deprecated = "use &mut s[start ..] instead"]
|
||||
fn slice_from_mut(&mut self, start: uint) -> &mut [Self::Item];
|
||||
|
||||
/// Returns a mutable subslice from the start of the slice to `end`.
|
||||
///
|
||||
/// Panics when `end` is strictly greater than the length of the original slice.
|
||||
///
|
||||
/// Slicing to `0` yields an empty slice.
|
||||
#[unstable = "will be replaced by slice syntax"]
|
||||
/// Deprecated: use `&mut s[.. end]` instead.
|
||||
#[deprecated = "use &mut s[.. end] instead"]
|
||||
fn slice_to_mut(&mut self, end: uint) -> &mut [Self::Item];
|
||||
|
||||
/// Returns an iterator that allows modifying each value
|
||||
|
@ -720,17 +694,17 @@ impl<T> SliceExt for [T] {
|
|||
|
||||
#[inline]
|
||||
fn slice<'a>(&'a self, start: uint, end: uint) -> &'a [T] {
|
||||
core_slice::SliceExt::slice(self, start, end)
|
||||
&self[start .. end]
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn slice_from<'a>(&'a self, start: uint) -> &'a [T] {
|
||||
core_slice::SliceExt::slice_from(self, start)
|
||||
&self[start ..]
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn slice_to<'a>(&'a self, end: uint) -> &'a [T] {
|
||||
core_slice::SliceExt::slice_to(self, end)
|
||||
&self[.. end]
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -834,17 +808,17 @@ impl<T> SliceExt for [T] {
|
|||
|
||||
#[inline]
|
||||
fn slice_mut<'a>(&'a mut self, start: uint, end: uint) -> &'a mut [T] {
|
||||
core_slice::SliceExt::slice_mut(self, start, end)
|
||||
&mut self[start .. end]
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn slice_from_mut<'a>(&'a mut self, start: uint) -> &'a mut [T] {
|
||||
core_slice::SliceExt::slice_from_mut(self, start)
|
||||
&mut self[start ..]
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn slice_to_mut<'a>(&'a mut self, end: uint) -> &'a mut [T] {
|
||||
core_slice::SliceExt::slice_to_mut(self, end)
|
||||
&mut self[.. end]
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
|
@ -750,64 +750,20 @@ pub trait StrExt: Index<FullRange, Output = str> {
|
|||
core_str::StrExt::lines_any(&self[])
|
||||
}
|
||||
|
||||
/// Returns a slice of the given string from the byte range
|
||||
/// [`begin`..`end`).
|
||||
///
|
||||
/// This operation is `O(1)`.
|
||||
///
|
||||
/// Panics when `begin` and `end` do not point to valid characters
|
||||
/// or point beyond the last character of the string.
|
||||
///
|
||||
/// See also `slice_to` and `slice_from` for slicing prefixes and
|
||||
/// suffixes of strings, and `slice_chars` for slicing based on
|
||||
/// code point counts.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```rust
|
||||
/// let s = "Löwe 老虎 Léopard";
|
||||
/// assert_eq!(s.slice(0, 1), "L");
|
||||
///
|
||||
/// assert_eq!(s.slice(1, 9), "öwe 老");
|
||||
///
|
||||
/// // these will panic:
|
||||
/// // byte 2 lies within `ö`:
|
||||
/// // s.slice(2, 3);
|
||||
///
|
||||
/// // byte 8 lies within `老`
|
||||
/// // s.slice(1, 8);
|
||||
///
|
||||
/// // byte 100 is outside the string
|
||||
/// // s.slice(3, 100);
|
||||
/// ```
|
||||
#[unstable = "use slice notation [a..b] instead"]
|
||||
/// Deprecated: use `s[a .. b]` instead.
|
||||
#[deprecated = "use slice notation [a..b] instead"]
|
||||
fn slice(&self, begin: uint, end: uint) -> &str {
|
||||
core_str::StrExt::slice(&self[], begin, end)
|
||||
}
|
||||
|
||||
/// Returns a slice of the string from `begin` to its end.
|
||||
///
|
||||
/// Equivalent to `self.slice(begin, self.len())`.
|
||||
///
|
||||
/// Panics when `begin` does not point to a valid character, or is
|
||||
/// out of bounds.
|
||||
///
|
||||
/// See also `slice`, `slice_to` and `slice_chars`.
|
||||
#[unstable = "use slice notation [a..] instead"]
|
||||
/// Deprecated: use `s[a..]` instead.
|
||||
#[deprecated = "use slice notation [a..] instead"]
|
||||
fn slice_from(&self, begin: uint) -> &str {
|
||||
core_str::StrExt::slice_from(&self[], begin)
|
||||
}
|
||||
|
||||
/// Returns a slice of the string from the beginning to byte
|
||||
/// `end`.
|
||||
///
|
||||
/// Equivalent to `self.slice(0, end)`.
|
||||
///
|
||||
/// Panics when `end` does not point to a valid character, or is
|
||||
/// out of bounds.
|
||||
///
|
||||
/// See also `slice`, `slice_from` and `slice_chars`.
|
||||
#[unstable = "use slice notation [..a] instead"]
|
||||
/// Deprecated: use `s[..a]` instead.
|
||||
#[deprecated = "use slice notation [..a] instead"]
|
||||
fn slice_to(&self, end: uint) -> &str {
|
||||
core_str::StrExt::slice_to(&self[], end)
|
||||
}
|
||||
|
|
|
@ -848,6 +848,7 @@ impl<'a> Add<&'a str> for String {
|
|||
}
|
||||
}
|
||||
|
||||
#[stable]
|
||||
impl ops::Index<ops::Range<uint>> for String {
|
||||
type Output = str;
|
||||
#[inline]
|
||||
|
@ -855,6 +856,7 @@ impl ops::Index<ops::Range<uint>> for String {
|
|||
&self[][*index]
|
||||
}
|
||||
}
|
||||
#[stable]
|
||||
impl ops::Index<ops::RangeTo<uint>> for String {
|
||||
type Output = str;
|
||||
#[inline]
|
||||
|
@ -862,6 +864,7 @@ impl ops::Index<ops::RangeTo<uint>> for String {
|
|||
&self[][*index]
|
||||
}
|
||||
}
|
||||
#[stable]
|
||||
impl ops::Index<ops::RangeFrom<uint>> for String {
|
||||
type Output = str;
|
||||
#[inline]
|
||||
|
@ -869,6 +872,7 @@ impl ops::Index<ops::RangeFrom<uint>> for String {
|
|||
&self[][*index]
|
||||
}
|
||||
}
|
||||
#[stable]
|
||||
impl ops::Index<ops::FullRange> for String {
|
||||
type Output = str;
|
||||
#[inline]
|
||||
|
|
|
@ -67,9 +67,6 @@ use raw::Slice as RawSlice;
|
|||
pub trait SliceExt {
|
||||
type Item;
|
||||
|
||||
fn slice<'a>(&'a self, start: uint, end: uint) -> &'a [Self::Item];
|
||||
fn slice_from<'a>(&'a self, start: uint) -> &'a [Self::Item];
|
||||
fn slice_to<'a>(&'a self, end: uint) -> &'a [Self::Item];
|
||||
fn split_at<'a>(&'a self, mid: uint) -> (&'a [Self::Item], &'a [Self::Item]);
|
||||
fn iter<'a>(&'a self) -> Iter<'a, Self::Item>;
|
||||
fn split<'a, P>(&'a self, pred: P) -> Split<'a, Self::Item, P>
|
||||
|
@ -93,9 +90,6 @@ pub trait SliceExt {
|
|||
fn is_empty(&self) -> bool { self.len() == 0 }
|
||||
fn get_mut<'a>(&'a mut self, index: uint) -> Option<&'a mut Self::Item>;
|
||||
fn as_mut_slice<'a>(&'a mut self) -> &'a mut [Self::Item];
|
||||
fn slice_mut<'a>(&'a mut self, start: uint, end: uint) -> &'a mut [Self::Item];
|
||||
fn slice_from_mut<'a>(&'a mut self, start: uint) -> &'a mut [Self::Item];
|
||||
fn slice_to_mut<'a>(&'a mut self, end: uint) -> &'a mut [Self::Item];
|
||||
fn iter_mut<'a>(&'a mut self) -> IterMut<'a, Self::Item>;
|
||||
fn first_mut<'a>(&'a mut self) -> Option<&'a mut Self::Item>;
|
||||
fn tail_mut<'a>(&'a mut self) -> &'a mut [Self::Item];
|
||||
|
@ -135,28 +129,6 @@ pub trait SliceExt {
|
|||
impl<T> SliceExt for [T] {
|
||||
type Item = T;
|
||||
|
||||
#[inline]
|
||||
fn slice(&self, start: uint, end: uint) -> &[T] {
|
||||
assert!(start <= end);
|
||||
assert!(end <= self.len());
|
||||
unsafe {
|
||||
transmute(RawSlice {
|
||||
data: self.as_ptr().offset(start as int),
|
||||
len: (end - start)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn slice_from(&self, start: uint) -> &[T] {
|
||||
self.slice(start, self.len())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn slice_to(&self, end: uint) -> &[T] {
|
||||
self.slice(0, end)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn split_at(&self, mid: uint) -> (&[T], &[T]) {
|
||||
(&self[..mid], &self[mid..])
|
||||
|
@ -291,20 +263,6 @@ impl<T> SliceExt for [T] {
|
|||
#[inline]
|
||||
fn as_mut_slice(&mut self) -> &mut [T] { self }
|
||||
|
||||
fn slice_mut(&mut self, start: uint, end: uint) -> &mut [T] {
|
||||
ops::IndexMut::index_mut(self, &ops::Range { start: start, end: end } )
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn slice_from_mut(&mut self, start: uint) -> &mut [T] {
|
||||
ops::IndexMut::index_mut(self, &ops::RangeFrom { start: start } )
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn slice_to_mut(&mut self, end: uint) -> &mut [T] {
|
||||
ops::IndexMut::index_mut(self, &ops::RangeTo { end: end } )
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn split_at_mut(&mut self, mid: uint) -> (&mut [T], &mut [T]) {
|
||||
unsafe {
|
||||
|
@ -345,13 +303,13 @@ impl<T> SliceExt for [T] {
|
|||
|
||||
#[inline]
|
||||
fn tail_mut(&mut self) -> &mut [T] {
|
||||
self.slice_from_mut(1)
|
||||
&mut self[1 ..]
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn init_mut(&mut self) -> &mut [T] {
|
||||
let len = self.len();
|
||||
self.slice_to_mut(len-1)
|
||||
&mut self[.. (len - 1)]
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -483,7 +441,7 @@ impl<T> SliceExt for [T] {
|
|||
self.swap(j, i-1);
|
||||
|
||||
// Step 4: Reverse the (previously) weakly decreasing part
|
||||
self.slice_from_mut(i).reverse();
|
||||
self[i..].reverse();
|
||||
|
||||
true
|
||||
}
|
||||
|
@ -505,7 +463,7 @@ impl<T> SliceExt for [T] {
|
|||
}
|
||||
|
||||
// Step 2: Reverse the weakly increasing part
|
||||
self.slice_from_mut(i).reverse();
|
||||
self[i..].reverse();
|
||||
|
||||
// Step 3: Find the rightmost element equal to or bigger than the pivot (i-1)
|
||||
let mut j = self.len() - 1;
|
||||
|
@ -522,8 +480,8 @@ impl<T> SliceExt for [T] {
|
|||
#[inline]
|
||||
fn clone_from_slice(&mut self, src: &[T]) -> uint where T: Clone {
|
||||
let min = cmp::min(self.len(), src.len());
|
||||
let dst = self.slice_to_mut(min);
|
||||
let src = src.slice_to(min);
|
||||
let dst = &mut self[.. min];
|
||||
let src = &src[.. min];
|
||||
for i in range(0, min) {
|
||||
dst[i].clone_from(&src[i]);
|
||||
}
|
||||
|
@ -531,6 +489,7 @@ impl<T> SliceExt for [T] {
|
|||
}
|
||||
}
|
||||
|
||||
#[stable]
|
||||
impl<T> ops::Index<uint> for [T] {
|
||||
type Output = T;
|
||||
|
||||
|
@ -541,6 +500,7 @@ impl<T> ops::Index<uint> for [T] {
|
|||
}
|
||||
}
|
||||
|
||||
#[stable]
|
||||
impl<T> ops::IndexMut<uint> for [T] {
|
||||
type Output = T;
|
||||
|
||||
|
@ -551,6 +511,7 @@ impl<T> ops::IndexMut<uint> for [T] {
|
|||
}
|
||||
}
|
||||
|
||||
#[stable]
|
||||
impl<T> ops::Index<ops::Range<uint>> for [T] {
|
||||
type Output = [T];
|
||||
#[inline]
|
||||
|
@ -565,6 +526,7 @@ impl<T> ops::Index<ops::Range<uint>> for [T] {
|
|||
}
|
||||
}
|
||||
}
|
||||
#[stable]
|
||||
impl<T> ops::Index<ops::RangeTo<uint>> for [T] {
|
||||
type Output = [T];
|
||||
#[inline]
|
||||
|
@ -572,6 +534,7 @@ impl<T> ops::Index<ops::RangeTo<uint>> for [T] {
|
|||
self.index(&ops::Range{ start: 0, end: index.end })
|
||||
}
|
||||
}
|
||||
#[stable]
|
||||
impl<T> ops::Index<ops::RangeFrom<uint>> for [T] {
|
||||
type Output = [T];
|
||||
#[inline]
|
||||
|
@ -579,6 +542,7 @@ impl<T> ops::Index<ops::RangeFrom<uint>> for [T] {
|
|||
self.index(&ops::Range{ start: index.start, end: self.len() })
|
||||
}
|
||||
}
|
||||
#[stable]
|
||||
impl<T> ops::Index<ops::FullRange> for [T] {
|
||||
type Output = [T];
|
||||
#[inline]
|
||||
|
@ -587,6 +551,7 @@ impl<T> ops::Index<ops::FullRange> for [T] {
|
|||
}
|
||||
}
|
||||
|
||||
#[stable]
|
||||
impl<T> ops::IndexMut<ops::Range<uint>> for [T] {
|
||||
type Output = [T];
|
||||
#[inline]
|
||||
|
@ -601,6 +566,7 @@ impl<T> ops::IndexMut<ops::Range<uint>> for [T] {
|
|||
}
|
||||
}
|
||||
}
|
||||
#[stable]
|
||||
impl<T> ops::IndexMut<ops::RangeTo<uint>> for [T] {
|
||||
type Output = [T];
|
||||
#[inline]
|
||||
|
@ -608,6 +574,7 @@ impl<T> ops::IndexMut<ops::RangeTo<uint>> for [T] {
|
|||
self.index_mut(&ops::Range{ start: 0, end: index.end })
|
||||
}
|
||||
}
|
||||
#[stable]
|
||||
impl<T> ops::IndexMut<ops::RangeFrom<uint>> for [T] {
|
||||
type Output = [T];
|
||||
#[inline]
|
||||
|
@ -616,6 +583,7 @@ impl<T> ops::IndexMut<ops::RangeFrom<uint>> for [T] {
|
|||
self.index_mut(&ops::Range{ start: index.start, end: len })
|
||||
}
|
||||
}
|
||||
#[stable]
|
||||
impl<T> ops::IndexMut<ops::FullRange> for [T] {
|
||||
type Output = [T];
|
||||
#[inline]
|
||||
|
@ -1051,7 +1019,7 @@ impl<'a, T, P> Iterator for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {
|
|||
Some(idx) => {
|
||||
let tmp = mem::replace(&mut self.v, &mut []);
|
||||
let (head, tail) = tmp.split_at_mut(idx);
|
||||
self.v = tail.slice_from_mut(1);
|
||||
self.v = &mut tail[1..];
|
||||
Some(head)
|
||||
}
|
||||
}
|
||||
|
@ -1087,7 +1055,7 @@ impl<'a, T, P> DoubleEndedIterator for SplitMut<'a, T, P> where
|
|||
let tmp = mem::replace(&mut self.v, &mut []);
|
||||
let (head, tail) = tmp.split_at_mut(idx);
|
||||
self.v = head;
|
||||
Some(tail.slice_from_mut(1))
|
||||
Some(&mut tail[1..])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -902,13 +902,13 @@ impl<'a> Iterator for SplitStr<'a> {
|
|||
|
||||
match self.it.next() {
|
||||
Some((from, to)) => {
|
||||
let ret = Some(self.it.haystack.slice(self.last_end, from));
|
||||
let ret = Some(&self.it.haystack[self.last_end .. from]);
|
||||
self.last_end = to;
|
||||
ret
|
||||
}
|
||||
None => {
|
||||
self.finished = true;
|
||||
Some(self.it.haystack.slice(self.last_end, self.it.haystack.len()))
|
||||
Some(&self.it.haystack[self.last_end .. self.it.haystack.len()])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1115,27 +1115,90 @@ mod traits {
|
|||
}
|
||||
}
|
||||
|
||||
/// Returns a slice of the given string from the byte range
|
||||
/// [`begin`..`end`).
|
||||
///
|
||||
/// This operation is `O(1)`.
|
||||
///
|
||||
/// Panics when `begin` and `end` do not point to valid characters
|
||||
/// or point beyond the last character of the string.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```rust
|
||||
/// let s = "Löwe 老虎 Léopard";
|
||||
/// assert_eq!(&s[0 .. 1], "L");
|
||||
///
|
||||
/// assert_eq!(&s[1 .. 9], "öwe 老");
|
||||
///
|
||||
/// // these will panic:
|
||||
/// // byte 2 lies within `ö`:
|
||||
/// // &s[2 ..3];
|
||||
///
|
||||
/// // byte 8 lies within `老`
|
||||
/// // &s[1 .. 8];
|
||||
///
|
||||
/// // byte 100 is outside the string
|
||||
/// // &s[3 .. 100];
|
||||
/// ```
|
||||
#[stable]
|
||||
impl ops::Index<ops::Range<uint>> for str {
|
||||
type Output = str;
|
||||
#[inline]
|
||||
fn index(&self, index: &ops::Range<uint>) -> &str {
|
||||
self.slice(index.start, index.end)
|
||||
// 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_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`.
|
||||
///
|
||||
/// Equivalent to `self[0 .. end]`.
|
||||
///
|
||||
/// Panics when `end` does not point to a valid character, or is
|
||||
/// out of bounds.
|
||||
#[stable]
|
||||
impl ops::Index<ops::RangeTo<uint>> for str {
|
||||
type Output = str;
|
||||
#[inline]
|
||||
fn index(&self, index: &ops::RangeTo<uint>) -> &str {
|
||||
self.slice_to(index.end)
|
||||
// is_char_boundary checks that the index is in [0, .len()]
|
||||
if self.is_char_boundary(index.end) {
|
||||
unsafe { self.slice_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()]`.
|
||||
///
|
||||
/// Panics when `begin` does not point to a valid character, or is
|
||||
/// out of bounds.
|
||||
#[stable]
|
||||
impl ops::Index<ops::RangeFrom<uint>> for str {
|
||||
type Output = str;
|
||||
#[inline]
|
||||
fn index(&self, index: &ops::RangeFrom<uint>) -> &str {
|
||||
self.slice_from(index.start)
|
||||
// is_char_boundary checks that the index is in [0, .len()]
|
||||
if self.is_char_boundary(index.start) {
|
||||
unsafe { self.slice_unchecked(index.start, self.len()) }
|
||||
} else {
|
||||
super::slice_error_fail(self, index.start, self.len())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[stable]
|
||||
impl ops::Index<ops::FullRange> for str {
|
||||
type Output = str;
|
||||
#[inline]
|
||||
|
@ -1208,9 +1271,6 @@ pub trait StrExt {
|
|||
fn lines<'a>(&'a self) -> Lines<'a>;
|
||||
fn lines_any<'a>(&'a self) -> LinesAny<'a>;
|
||||
fn char_len(&self) -> uint;
|
||||
fn slice<'a>(&'a self, begin: uint, end: uint) -> &'a str;
|
||||
fn slice_from<'a>(&'a self, begin: uint) -> &'a str;
|
||||
fn slice_to<'a>(&'a self, end: uint) -> &'a str;
|
||||
fn slice_chars<'a>(&'a self, begin: uint, end: uint) -> &'a str;
|
||||
unsafe fn slice_unchecked<'a>(&'a self, begin: uint, end: uint) -> &'a str;
|
||||
fn starts_with(&self, pat: &str) -> bool;
|
||||
|
@ -1332,7 +1392,7 @@ impl StrExt for str {
|
|||
fn lines_any(&self) -> LinesAny {
|
||||
fn f(line: &str) -> &str {
|
||||
let l = line.len();
|
||||
if l > 0 && line.as_bytes()[l - 1] == b'\r' { line.slice(0, l - 1) }
|
||||
if l > 0 && line.as_bytes()[l - 1] == b'\r' { &line[0 .. l - 1] }
|
||||
else { line }
|
||||
}
|
||||
|
||||
|
@ -1343,38 +1403,6 @@ impl StrExt for str {
|
|||
#[inline]
|
||||
fn char_len(&self) -> uint { self.chars().count() }
|
||||
|
||||
#[inline]
|
||||
fn slice(&self, begin: uint, end: uint) -> &str {
|
||||
// is_char_boundary checks that the index is in [0, .len()]
|
||||
if begin <= end &&
|
||||
self.is_char_boundary(begin) &&
|
||||
self.is_char_boundary(end) {
|
||||
unsafe { self.slice_unchecked(begin, end) }
|
||||
} else {
|
||||
slice_error_fail(self, begin, end)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn slice_from(&self, begin: uint) -> &str {
|
||||
// is_char_boundary checks that the index is in [0, .len()]
|
||||
if self.is_char_boundary(begin) {
|
||||
unsafe { self.slice_unchecked(begin, self.len()) }
|
||||
} else {
|
||||
slice_error_fail(self, begin, self.len())
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn slice_to(&self, end: uint) -> &str {
|
||||
// is_char_boundary checks that the index is in [0, .len()]
|
||||
if self.is_char_boundary(end) {
|
||||
unsafe { self.slice_unchecked(0, end) }
|
||||
} else {
|
||||
slice_error_fail(self, 0, end)
|
||||
}
|
||||
}
|
||||
|
||||
fn slice_chars(&self, begin: uint, end: uint) -> &str {
|
||||
assert!(begin <= end);
|
||||
let mut count = 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue