diff options
| author | Aaron Turon <aturon@mozilla.com> | 2014-11-04 15:31:46 -0800 |
|---|---|---|
| committer | Aaron Turon <aturon@mozilla.com> | 2014-11-20 00:05:00 -0800 |
| commit | 004db80afe08b28d79741c486ceb8398e6725829 (patch) | |
| tree | d365766bb4558d1339ad6bbbef51ea6e969a9304 /src/libcore | |
| parent | 793624261a221aa4592381fa8067e1f597b90c22 (diff) | |
| download | rust-004db80afe08b28d79741c486ceb8398e6725829.tar.gz rust-004db80afe08b28d79741c486ceb8398e6725829.zip | |
libcore: DST-ify AsSlice
This commit changes `AsSlice` to work on unsized types, and changes the
`impl` for `&[T]` to `[T]`. Aside from making the trait more general,
this also helps some ongoing work with method resolution changes.
This is a breaking change: code that uses generics bounded by `AsSlice`
will have to change. In particular, such code previously often took
arguments of type `V` where `V: AsSlice<T>` by value. These should now
be taken by reference:
```rust
fn foo<Sized? V: AsSlice<T>>(v: &V) { .. }
```
A few std lib functions have been changed accordingly.
[breaking-change]
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/slice.rs | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index 48e52fab51c..7a3e06e7eb4 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -1008,15 +1008,25 @@ impl<T: Clone> CloneSlicePrelude<T> for [T] { /// Data that is viewable as a slice. #[unstable = "may merge with other traits"] -pub trait AsSlice<T> { +pub trait AsSlice<T> for Sized? { /// Work with `self` as a slice. fn as_slice<'a>(&'a self) -> &'a [T]; } #[unstable = "trait is unstable"] -impl<'a,T> AsSlice<T> for &'a [T] { +impl<T> AsSlice<T> for [T] { #[inline(always)] - fn as_slice<'a>(&'a self) -> &'a [T] { *self } + fn as_slice<'a>(&'a self) -> &'a [T] { self } +} + +impl<'a, T, Sized? U: AsSlice<T>> AsSlice<T> for &'a U { + #[inline(always)] + fn as_slice<'a>(&'a self) -> &'a [T] { AsSlice::as_slice(*self) } +} + +impl<'a, T, Sized? U: AsSlice<T>> AsSlice<T> for &'a mut U { + #[inline(always)] + fn as_slice<'a>(&'a self) -> &'a [T] { AsSlice::as_slice(*self) } } #[unstable = "waiting for DST"] @@ -1681,13 +1691,13 @@ impl<T: PartialEq> PartialEq for [T] { impl<T: Eq> Eq for [T] {} #[unstable = "waiting for DST"] -impl<T: PartialEq, V: AsSlice<T>> Equiv<V> for [T] { +impl<T: PartialEq, Sized? V: AsSlice<T>> Equiv<V> for [T] { #[inline] fn equiv(&self, other: &V) -> bool { self.as_slice() == other.as_slice() } } #[unstable = "waiting for DST"] -impl<'a,T:PartialEq, V: AsSlice<T>> Equiv<V> for &'a mut [T] { +impl<'a,T:PartialEq, Sized? V: AsSlice<T>> Equiv<V> for &'a mut [T] { #[inline] fn equiv(&self, other: &V) -> bool { self.as_slice() == other.as_slice() } } |
