diff options
| author | bors <bors@rust-lang.org> | 2014-10-02 03:07:17 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-10-02 03:07:17 +0000 |
| commit | 07b2c1be9dad53272575844efedfb7314fc4fb84 (patch) | |
| tree | d26dab000c4444cf6e972bb30da0392e675ca52b /src/libcore | |
| parent | d53874eccf0657d5d9c0a9ed9f84380d27d1c423 (diff) | |
| parent | 6e0611a48707a1f5d90aee32a02b2b15957ef25b (diff) | |
| download | rust-07b2c1be9dad53272575844efedfb7314fc4fb84.tar.gz rust-07b2c1be9dad53272575844efedfb7314fc4fb84.zip | |
auto merge of #17620 : nick29581/rust/slice4, r=aturon
cc @aturon r? anyone?
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/fmt/float.rs | 8 | ||||
| -rw-r--r-- | src/libcore/fmt/mod.rs | 8 | ||||
| -rw-r--r-- | src/libcore/fmt/num.rs | 4 | ||||
| -rw-r--r-- | src/libcore/lib.rs | 3 | ||||
| -rw-r--r-- | src/libcore/ops.rs | 57 | ||||
| -rw-r--r-- | src/libcore/slice.rs | 217 | ||||
| -rw-r--r-- | src/libcore/str.rs | 100 |
7 files changed, 206 insertions, 191 deletions
diff --git a/src/libcore/fmt/float.rs b/src/libcore/fmt/float.rs index 92ef0c281f2..343ab7cfd28 100644 --- a/src/libcore/fmt/float.rs +++ b/src/libcore/fmt/float.rs @@ -17,7 +17,7 @@ use iter::{range, DoubleEndedIterator}; use num::{Float, FPNaN, FPInfinite, ToPrimitive, Primitive}; use num::{Zero, One, cast}; use result::Ok; -use slice::{ImmutableSlice, MutableSlice}; +use slice::MutableSlice; use slice; use str::StrSlice; @@ -173,7 +173,7 @@ pub fn float_to_str_bytes_common<T: Primitive + Float, U>( _ => () } - buf.slice_to_mut(end).reverse(); + buf[mut ..end].reverse(); // Remember start of the fractional digits. // Points one beyond end of buf if none get generated, @@ -310,7 +310,7 @@ pub fn float_to_str_bytes_common<T: Primitive + Float, U>( impl<'a> fmt::FormatWriter for Filler<'a> { fn write(&mut self, bytes: &[u8]) -> fmt::Result { - slice::bytes::copy_memory(self.buf.slice_from_mut(*self.end), + slice::bytes::copy_memory(self.buf[mut *self.end..], bytes); *self.end += bytes.len(); Ok(()) @@ -328,5 +328,5 @@ pub fn float_to_str_bytes_common<T: Primitive + Float, U>( } } - f(buf.slice_to(end)) + f(buf[..end]) } diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs index 7bab59960b0..28ee522346f 100644 --- a/src/libcore/fmt/mod.rs +++ b/src/libcore/fmt/mod.rs @@ -423,7 +423,7 @@ impl<'a> Formatter<'a> { for c in sign.into_iter() { let mut b = [0, ..4]; let n = c.encode_utf8(b).unwrap_or(0); - try!(f.buf.write(b.slice_to(n))); + try!(f.buf.write(b[..n])); } if prefixed { f.buf.write(prefix.as_bytes()) } else { Ok(()) } @@ -530,13 +530,13 @@ impl<'a> Formatter<'a> { let len = self.fill.encode_utf8(fill).unwrap_or(0); for _ in range(0, pre_pad) { - try!(self.buf.write(fill.slice_to(len))); + try!(self.buf.write(fill[..len])); } try!(f(self)); for _ in range(0, post_pad) { - try!(self.buf.write(fill.slice_to(len))); + try!(self.buf.write(fill[..len])); } Ok(()) @@ -611,7 +611,7 @@ impl Char for char { let mut utf8 = [0u8, ..4]; let amt = self.encode_utf8(utf8).unwrap_or(0); - let s: &str = unsafe { mem::transmute(utf8.slice_to(amt)) }; + let s: &str = unsafe { mem::transmute(utf8[..amt]) }; secret_string(&s, f) } } diff --git a/src/libcore/fmt/num.rs b/src/libcore/fmt/num.rs index afcd0d1d645..e57c4999483 100644 --- a/src/libcore/fmt/num.rs +++ b/src/libcore/fmt/num.rs @@ -18,7 +18,7 @@ use collections::Collection; use fmt; use iter::DoubleEndedIterator; use num::{Int, cast, zero}; -use slice::{ImmutableSlice, MutableSlice}; +use slice::{MutableSlice}; /// A type that represents a specific radix #[doc(hidden)] @@ -60,7 +60,7 @@ trait GenericRadix { if x == zero() { break; } // No more digits left to accumulate. } } - f.pad_integral(is_positive, self.prefix(), buf.slice_from(curr)) + f.pad_integral(is_positive, self.prefix(), buf[curr..]) } } diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 7e2ea492d4c..4890dc2bb73 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -57,8 +57,9 @@ html_playground_url = "http://play.rust-lang.org/")] #![no_std] +#![allow(unknown_features)] #![feature(globs, intrinsics, lang_items, macro_rules, managed_boxes, phase)] -#![feature(simd, unsafe_destructor)] +#![feature(simd, unsafe_destructor, slicing_syntax)] #![deny(missing_doc)] mod macros; diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index ad0f128a02e..422c496995b 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -684,23 +684,23 @@ pub trait IndexMut<Index, Result> { * A trivial implementation of `Slice`. When `Foo[..Foo]` happens, it ends up * calling `slice_to`, and therefore, `main` prints `Slicing!`. * - * ``` + * ```ignore * struct Foo; * * impl ::core::ops::Slice<Foo, Foo> for Foo { - * fn as_slice_<'a>(&'a self) -> &'a Foo { + * fn as_slice<'a>(&'a self) -> &'a Foo { * println!("Slicing!"); * self * } - * fn slice_from_<'a>(&'a self, from: &Foo) -> &'a Foo { + * fn slice_from<'a>(&'a self, from: &Foo) -> &'a Foo { * println!("Slicing!"); * self * } - * fn slice_to_<'a>(&'a self, to: &Foo) -> &'a Foo { + * fn slice_to<'a>(&'a self, to: &Foo) -> &'a Foo { * println!("Slicing!"); * self * } - * fn slice_<'a>(&'a self, from: &Foo, to: &Foo) -> &'a Foo { + * fn slice<'a>(&'a self, from: &Foo, to: &Foo) -> &'a Foo { * println!("Slicing!"); * self * } @@ -711,7 +711,22 @@ pub trait IndexMut<Index, Result> { * } * ``` */ -// FIXME(#17273) remove the postscript _s +#[cfg(not(stage0))] +#[lang="slice"] +pub trait Slice<Idx, Sized? Result> for Sized? { + /// The method for the slicing operation foo[] + fn as_slice<'a>(&'a self) -> &'a Result; + /// The method for the slicing operation foo[from..] + fn slice_from<'a>(&'a self, from: &Idx) -> &'a Result; + /// The method for the slicing operation foo[..to] + fn slice_to<'a>(&'a self, to: &Idx) -> &'a Result; + /// The method for the slicing operation foo[from..to] + fn slice<'a>(&'a self, from: &Idx, to: &Idx) -> &'a Result; +} +/** + * + */ +#[cfg(stage0)] #[lang="slice"] pub trait Slice<Idx, Sized? Result> for Sized? { /// The method for the slicing operation foo[] @@ -734,34 +749,49 @@ pub trait Slice<Idx, Sized? Result> for Sized? { * A trivial implementation of `SliceMut`. When `Foo[Foo..]` happens, it ends up * calling `slice_from_mut`, and therefore, `main` prints `Slicing!`. * - * ``` + * ```ignore * struct Foo; * * impl ::core::ops::SliceMut<Foo, Foo> for Foo { - * fn as_mut_slice_<'a>(&'a mut self) -> &'a mut Foo { + * fn as_mut_slice<'a>(&'a mut self) -> &'a mut Foo { * println!("Slicing!"); * self * } - * fn slice_from_mut_<'a>(&'a mut self, from: &Foo) -> &'a mut Foo { + * fn slice_from_mut<'a>(&'a mut self, from: &Foo) -> &'a mut Foo { * println!("Slicing!"); * self * } - * fn slice_to_mut_<'a>(&'a mut self, to: &Foo) -> &'a mut Foo { + * fn slice_to_mut<'a>(&'a mut self, to: &Foo) -> &'a mut Foo { * println!("Slicing!"); * self * } - * fn slice_mut_<'a>(&'a mut self, from: &Foo, to: &Foo) -> &'a mut Foo { + * fn slice_mut<'a>(&'a mut self, from: &Foo, to: &Foo) -> &'a mut Foo { * println!("Slicing!"); * self * } * } * - * fn main() { + * pub fn main() { * Foo[mut Foo..]; * } * ``` */ -// FIXME(#17273) remove the postscript _s +#[cfg(not(stage0))] +#[lang="slice_mut"] +pub trait SliceMut<Idx, Sized? Result> for Sized? { + /// The method for the slicing operation foo[] + fn as_mut_slice<'a>(&'a mut self) -> &'a mut Result; + /// The method for the slicing operation foo[from..] + fn slice_from_mut<'a>(&'a mut self, from: &Idx) -> &'a mut Result; + /// The method for the slicing operation foo[..to] + fn slice_to_mut<'a>(&'a mut self, to: &Idx) -> &'a mut Result; + /// The method for the slicing operation foo[from..to] + fn slice_mut<'a>(&'a mut self, from: &Idx, to: &Idx) -> &'a mut Result; +} +/** + * + */ +#[cfg(stage0)] #[lang="slice_mut"] pub trait SliceMut<Idx, Sized? Result> for Sized? { /// The method for the slicing operation foo[mut] @@ -773,6 +803,7 @@ pub trait SliceMut<Idx, Sized? Result> for Sized? { /// The method for the slicing operation foo[mut from..to] fn slice_mut_<'a>(&'a mut self, from: &Idx, to: &Idx) -> &'a mut Result; } + /** * * The `Deref` trait is used to specify the functionality of dereferencing diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index 1a00107a216..a8becb315b2 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -61,31 +61,6 @@ use raw::Slice as RawSlice; /// Extension methods for immutable slices. #[unstable = "may merge with other traits; region parameter may disappear"] pub trait ImmutableSlice<'a, T> { - /// Returns a subslice spanning the interval [`start`, `end`). - /// - /// Fails 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 = "waiting on final error conventions"] - fn slice(&self, start: uint, end: uint) -> &'a [T]; - - /// Returns a subslice from `start` to the end of the slice. - /// - /// Fails when `start` is strictly greater than the length of the original slice. - /// - /// Slicing from `self.len()` yields an empty slice. - #[unstable = "waiting on final error conventions"] - fn slice_from(&self, start: uint) -> &'a [T]; - - /// Returns a subslice from the start of the slice to `end`. - /// - /// Fails when `end` is strictly greater than the length of the original slice. - /// - /// Slicing to `0` yields an empty slice. - #[unstable = "waiting on final error conventions"] - fn slice_to(&self, end: uint) -> &'a [T]; - /// Divides one slice into two at an index. /// /// The first will contain all indices from `[0, mid)` (excluding @@ -240,7 +215,7 @@ pub trait ImmutableSlice<'a, T> { * ```ignore * if self.len() == 0 { return None } * let head = &self[0]; - * *self = self.slice_from(1); + * *self = self[1..]; * Some(head) * ``` * @@ -259,7 +234,7 @@ pub trait ImmutableSlice<'a, T> { * ```ignore * if self.len() == 0 { return None; } * let tail = &self[self.len() - 1]; - * *self = self.slice_to(self.len() - 1); + * *self = self[..self.len() - 1]; * Some(tail) * ``` * @@ -272,30 +247,8 @@ pub trait ImmutableSlice<'a, T> { #[unstable] impl<'a,T> ImmutableSlice<'a, T> for &'a [T] { #[inline] - fn slice(&self, start: uint, end: uint) -> &'a [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) -> &'a [T] { - self.slice(start, self.len()) - } - - #[inline] - fn slice_to(&self, end: uint) -> &'a [T] { - self.slice(0, end) - } - - #[inline] fn split_at(&self, mid: uint) -> (&'a [T], &'a [T]) { - (self.slice(0, mid), self.slice(mid, self.len())) + ((*self)[..mid], (*self)[mid..]) } #[inline] @@ -364,21 +317,21 @@ impl<'a,T> ImmutableSlice<'a, T> for &'a [T] { } #[inline] - fn tail(&self) -> &'a [T] { self.slice(1, self.len()) } + fn tail(&self) -> &'a [T] { (*self)[1..] } #[inline] #[deprecated = "use slice_from"] - fn tailn(&self, n: uint) -> &'a [T] { self.slice(n, self.len()) } + fn tailn(&self, n: uint) -> &'a [T] { (*self)[n..] } #[inline] fn init(&self) -> &'a [T] { - self.slice(0, self.len() - 1) + (*self)[..self.len() - 1] } #[inline] #[deprecated = "use slice_to but note the arguments are different"] fn initn(&self, n: uint) -> &'a [T] { - self.slice(0, self.len() - n) + (*self)[..self.len() - n] } #[inline] @@ -464,6 +417,35 @@ impl<'a,T> ImmutableSlice<'a, T> for &'a [T] { } } +#[cfg(not(stage0))] +impl<T> ops::Slice<uint, [T]> for [T] { + #[inline] + fn as_slice<'a>(&'a self) -> &'a [T] { + self + } + + #[inline] + fn slice_from<'a>(&'a self, start: &uint) -> &'a [T] { + self.slice(start, &self.len()) + } + + #[inline] + fn slice_to<'a>(&'a self, end: &uint) -> &'a [T] { + self.slice(&0, end) + } + #[inline] + fn slice<'a>(&'a self, start: &uint, end: &uint) -> &'a [T] { + assert!(*start <= *end); + assert!(*end <= self.len()); + unsafe { + transmute(RawSlice { + data: self.as_ptr().offset(*start as int), + len: (*end - *start) + }) + } + } +} +#[cfg(stage0)] impl<T> ops::Slice<uint, [T]> for [T] { #[inline] fn as_slice_<'a>(&'a self) -> &'a [T] { @@ -491,7 +473,36 @@ impl<T> ops::Slice<uint, [T]> for [T] { } } } +#[cfg(not(stage0))] +impl<T> ops::SliceMut<uint, [T]> for [T] { + #[inline] + fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T] { + self + } + #[inline] + fn slice_from_mut<'a>(&'a mut self, start: &uint) -> &'a mut [T] { + let len = &self.len(); + self.slice_mut(start, len) + } + + #[inline] + fn slice_to_mut<'a>(&'a mut self, end: &uint) -> &'a mut [T] { + self.slice_mut(&0, end) + } + #[inline] + fn slice_mut<'a>(&'a mut self, start: &uint, end: &uint) -> &'a mut [T] { + assert!(*start <= *end); + assert!(*end <= self.len()); + unsafe { + transmute(RawSlice { + data: self.as_ptr().offset(*start as int), + len: (*end - *start) + }) + } + } +} +#[cfg(stage0)] impl<T> ops::SliceMut<uint, [T]> for [T] { #[inline] fn as_mut_slice_<'a>(&'a mut self) -> &'a mut [T] { @@ -533,49 +544,6 @@ pub trait MutableSlice<'a, T> { /// Primarily intended for getting a &mut [T] from a [T, ..N]. fn as_mut_slice(self) -> &'a mut [T]; - /// Deprecated: use `slice_mut`. - #[deprecated = "use slice_mut"] - fn mut_slice(self, start: uint, end: uint) -> &'a mut [T] { - self.slice_mut(start, end) - } - - /// Returns a mutable subslice spanning the interval [`start`, `end`). - /// - /// Fails 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 = "waiting on final error conventions"] - fn slice_mut(self, start: uint, end: uint) -> &'a mut [T]; - - /// Deprecated: use `slice_from_mut`. - #[deprecated = "use slice_from_mut"] - fn mut_slice_from(self, start: uint) -> &'a mut [T] { - self.slice_from_mut(start) - } - - /// Returns a mutable subslice from `start` to the end of the slice. - /// - /// Fails when `start` is strictly greater than the length of the original slice. - /// - /// Slicing from `self.len()` yields an empty slice. - #[unstable = "waiting on final error conventions"] - fn slice_from_mut(self, start: uint) -> &'a mut [T]; - - /// Deprecated: use `slice_to_mut`. - #[deprecated = "use slice_to_mut"] - fn mut_slice_to(self, end: uint) -> &'a mut [T] { - self.slice_to_mut(end) - } - - /// Returns a mutable subslice from the start of the slice to `end`. - /// - /// Fails when `end` is strictly greater than the length of the original slice. - /// - /// Slicing to `0` yields an empty slice. - #[unstable = "waiting on final error conventions"] - fn slice_to_mut(self, end: uint) -> &'a mut [T]; - /// Deprecated: use `iter_mut`. #[deprecated = "use iter_mut"] fn mut_iter(self) -> MutItems<'a, T> { @@ -659,7 +627,7 @@ pub trait MutableSlice<'a, T> { * ```ignore * if self.len() == 0 { return None; } * let head = &mut self[0]; - * *self = self.slice_from_mut(1); + * *self = self[mut 1..]; * Some(head) * ``` * @@ -678,7 +646,7 @@ pub trait MutableSlice<'a, T> { * ```ignore * if self.len() == 0 { return None; } * let tail = &mut self[self.len() - 1]; - * *self = self.slice_to_mut(self.len() - 1); + * *self = self[mut ..self.len() - 1]; * Some(tail) * ``` * @@ -803,34 +771,11 @@ impl<'a,T> MutableSlice<'a, T> for &'a mut [T] { #[inline] fn as_mut_slice(self) -> &'a mut [T] { self } - fn slice_mut(self, start: uint, end: uint) -> &'a mut [T] { - assert!(start <= end); - assert!(end <= self.len()); - unsafe { - transmute(RawSlice { - data: self.as_mut_ptr().offset(start as int) as *const T, - len: (end - start) - }) - } - } - - #[inline] - fn slice_from_mut(self, start: uint) -> &'a mut [T] { - let len = self.len(); - self.slice_mut(start, len) - } - - #[inline] - fn slice_to_mut(self, end: uint) -> &'a mut [T] { - self.slice_mut(0, end) - } - #[inline] fn split_at_mut(self, mid: uint) -> (&'a mut [T], &'a mut [T]) { unsafe { - let len = self.len(); let self2: &'a mut [T] = mem::transmute_copy(&self); - (self.slice_mut(0, mid), self2.slice_mut(mid, len)) + (self[mut ..mid], self2[mut mid..]) } } @@ -867,13 +812,13 @@ impl<'a,T> MutableSlice<'a, T> for &'a mut [T] { #[inline] fn tail_mut(self) -> &'a mut [T] { let len = self.len(); - self.slice_mut(1, len) + self[mut 1..len] } #[inline] fn init_mut(self) -> &'a mut [T] { let len = self.len(); - self.slice_mut(0, len - 1) + self[mut 0..len - 1] } #[inline] @@ -1020,13 +965,13 @@ impl<'a,T:PartialEq> ImmutablePartialEqSlice<T> for &'a [T] { #[inline] fn starts_with(&self, needle: &[T]) -> bool { let n = needle.len(); - self.len() >= n && needle == self.slice_to(n) + self.len() >= n && needle == (*self)[..n] } #[inline] fn ends_with(&self, needle: &[T]) -> bool { let (m, n) = (self.len(), needle.len()); - m >= n && needle == self.slice_from(m - n) + m >= n && needle == (*self)[m-n..] } } @@ -1299,8 +1244,8 @@ impl<'a, T> Iterator<&'a [T]> for Splits<'a, T> { match self.v.iter().position(|x| (self.pred)(x)) { None => self.finish(), Some(idx) => { - let ret = Some(self.v.slice(0, idx)); - self.v = self.v.slice(idx + 1, self.v.len()); + let ret = Some(self.v[..idx]); + self.v = self.v[idx + 1..]; ret } } @@ -1325,8 +1270,8 @@ impl<'a, T> DoubleEndedIterator<&'a [T]> for Splits<'a, T> { match self.v.iter().rposition(|x| (self.pred)(x)) { None => self.finish(), Some(idx) => { - let ret = Some(self.v.slice(idx + 1, self.v.len())); - self.v = self.v.slice(0, idx); + let ret = Some(self.v[idx + 1..]); + self.v = self.v[..idx]; ret } } @@ -1376,7 +1321,7 @@ impl<'a, T> Iterator<&'a mut [T]> for MutSplits<'a, T> { 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 = tail[mut 1..]; Some(head) } } @@ -1410,7 +1355,7 @@ impl<'a, T> DoubleEndedIterator<&'a mut [T]> for MutSplits<'a, T> { 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(tail[mut 1..]) } } } @@ -1458,8 +1403,8 @@ impl<'a, T> Iterator<&'a [T]> for Windows<'a, T> { if self.size > self.v.len() { None } else { - let ret = Some(self.v.slice(0, self.size)); - self.v = self.v.slice(1, self.v.len()); + let ret = Some(self.v[..self.size]); + self.v = self.v[1..]; ret } } @@ -1543,7 +1488,7 @@ impl<'a, T> RandomAccessIterator<&'a [T]> for Chunks<'a, T> { let mut hi = lo + self.size; if hi < lo || hi > self.v.len() { hi = self.v.len(); } - Some(self.v.slice(lo, hi)) + Some(self.v[lo..hi]) } else { None } diff --git a/src/libcore/str.rs b/src/libcore/str.rs index fd7c63a6b32..1c20d364bf8 100644 --- a/src/libcore/str.rs +++ b/src/libcore/str.rs @@ -30,7 +30,7 @@ use iter::range; use num::{CheckedMul, Saturating}; use option::{Option, None, Some}; use raw::Repr; -use slice::{ImmutableSlice, MutableSlice}; +use slice::ImmutableSlice; use slice; use uint; @@ -393,7 +393,7 @@ impl NaiveSearcher { fn next(&mut self, haystack: &[u8], needle: &[u8]) -> Option<(uint, uint)> { while self.position + needle.len() <= haystack.len() { - if haystack.slice(self.position, self.position + needle.len()) == needle { + if haystack[self.position .. self.position + needle.len()] == needle { let match_pos = self.position; self.position += needle.len(); // add 1 for all matches return Some((match_pos, match_pos + needle.len())); @@ -514,10 +514,10 @@ impl TwoWaySearcher { // // What's going on is we have some critical factorization (u, v) of the // needle, and we want to determine whether u is a suffix of - // v.slice_to(period). If it is, we use "Algorithm CP1". Otherwise we use + // v[..period]. If it is, we use "Algorithm CP1". Otherwise we use // "Algorithm CP2", which is optimized for when the period of the needle // is large. - if needle.slice_to(crit_pos) == needle.slice(period, period + crit_pos) { + if needle[..crit_pos] == needle[period.. period + crit_pos] { TwoWaySearcher { crit_pos: crit_pos, period: period, @@ -741,7 +741,7 @@ impl<'a> Iterator<u16> for Utf16CodeUnits<'a> { let mut buf = [0u16, ..2]; self.chars.next().map(|ch| { - let n = ch.encode_utf16(buf.as_mut_slice()).unwrap_or(0); + let n = ch.encode_utf16(buf[mut]).unwrap_or(0); if n == 2 { self.extra = buf[1]; } buf[0] }) @@ -1007,7 +1007,7 @@ pub fn utf16_items<'a>(v: &'a [u16]) -> Utf16Items<'a> { pub fn truncate_utf16_at_nul<'a>(v: &'a [u16]) -> &'a [u16] { match v.iter().position(|c| *c == 0) { // don't include the 0 - Some(i) => v.slice_to(i), + Some(i) => v[..i], None => v } } @@ -1164,6 +1164,7 @@ pub mod traits { fn equiv(&self, other: &S) -> bool { eq_slice(*self, other.as_slice()) } } + #[cfg(stage0)] impl ops::Slice<uint, str> for str { #[inline] fn as_slice_<'a>(&'a self) -> &'a str { @@ -1172,17 +1173,39 @@ pub mod traits { #[inline] fn slice_from_<'a>(&'a self, from: &uint) -> &'a str { - self.slice_from(*from) + super::slice_from_impl(&self, *from) } #[inline] fn slice_to_<'a>(&'a self, to: &uint) -> &'a str { - self.slice_to(*to) + super::slice_to_impl(&self, *to) } #[inline] fn slice_<'a>(&'a self, from: &uint, to: &uint) -> &'a str { - self.slice(*from, *to) + super::slice_impl(&self, *from, *to) + } + } + #[cfg(not(stage0))] + impl ops::Slice<uint, str> for str { + #[inline] + fn as_slice<'a>(&'a self) -> &'a str { + self + } + + #[inline] + fn slice_from<'a>(&'a self, from: &uint) -> &'a str { + super::slice_from_impl(&self, *from) + } + + #[inline] + fn slice_to<'a>(&'a self, to: &uint) -> &'a str { + super::slice_to_impl(&self, *to) + } + + #[inline] + fn slice<'a>(&'a self, from: &uint, to: &uint) -> &'a str { + super::slice_impl(&self, *from, *to) } } } @@ -1835,6 +1858,38 @@ fn slice_error_fail(s: &str, begin: uint, end: uint) -> ! { begin, end, s); } +#[inline] +fn slice_impl<'a>(this: &&'a str, begin: uint, end: uint) -> &'a str { + // is_char_boundary checks that the index is in [0, .len()] + if begin <= end && + this.is_char_boundary(begin) && + this.is_char_boundary(end) { + unsafe { raw::slice_unchecked(*this, begin, end) } + } else { + slice_error_fail(*this, begin, end) + } +} + +#[inline] +fn slice_from_impl<'a>(this: &&'a str, begin: uint) -> &'a str { + // is_char_boundary checks that the index is in [0, .len()] + if this.is_char_boundary(begin) { + unsafe { raw::slice_unchecked(*this, begin, this.len()) } + } else { + slice_error_fail(*this, begin, this.len()) + } +} + +#[inline] +fn slice_to_impl<'a>(this: &&'a str, end: uint) -> &'a str { + // is_char_boundary checks that the index is in [0, .len()] + if this.is_char_boundary(end) { + unsafe { raw::slice_unchecked(*this, 0, end) } + } else { + slice_error_fail(*this, 0, end) + } +} + impl<'a> StrSlice<'a> for &'a str { #[inline] fn contains<'a>(&self, needle: &'a str) -> bool { @@ -1938,34 +1993,17 @@ impl<'a> StrSlice<'a> for &'a str { #[inline] fn slice(&self, begin: uint, end: uint) -> &'a 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 { raw::slice_unchecked(*self, begin, end) } - } else { - slice_error_fail(*self, begin, end) - } + slice_impl(self, begin, end) } #[inline] fn slice_from(&self, begin: uint) -> &'a str { - // is_char_boundary checks that the index is in [0, .len()] - if self.is_char_boundary(begin) { - unsafe { raw::slice_unchecked(*self, begin, self.len()) } - } else { - slice_error_fail(*self, begin, self.len()) - } + slice_from_impl(self, begin) } #[inline] fn slice_to(&self, end: uint) -> &'a str { - // is_char_boundary checks that the index is in [0, .len()] - if self.is_char_boundary(end) { - unsafe { raw::slice_unchecked(*self, 0, end) } - } else { - slice_error_fail(*self, 0, end) - } + slice_to_impl(self, end) } fn slice_chars(&self, begin: uint, end: uint) -> &'a str { @@ -1994,13 +2032,13 @@ impl<'a> StrSlice<'a> for &'a str { #[inline] fn starts_with<'a>(&self, needle: &'a str) -> bool { let n = needle.len(); - self.len() >= n && needle.as_bytes() == self.as_bytes().slice_to(n) + self.len() >= n && needle.as_bytes() == self.as_bytes()[..n] } #[inline] fn ends_with(&self, needle: &str) -> bool { let (m, n) = (self.len(), needle.len()); - m >= n && needle.as_bytes() == self.as_bytes().slice_from(m - n) + m >= n && needle.as_bytes() == self.as_bytes()[m-n..] } #[inline] |
