diff options
| author | bors <bors@rust-lang.org> | 2016-01-01 13:51:38 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-01-01 13:51:38 +0000 |
| commit | 88e819f478c530d4e1ca7243e327803771b532af (patch) | |
| tree | fb0e0c17cb334246652cfd62a199c70d37010224 | |
| parent | bfb4212ee2ae658dfd4feb5991ebff55e9ac5240 (diff) | |
| parent | c9fd3d4f91abeacc5be5155e5f584dac4e8273d9 (diff) | |
| download | rust-88e819f478c530d4e1ca7243e327803771b532af.tar.gz rust-88e819f478c530d4e1ca7243e327803771b532af.zip | |
Auto merge of #30663 - apasel422:ll, r=bluss
CC #30642 r? @Gankro
| -rw-r--r-- | src/libcollections/lib.rs | 2 | ||||
| -rw-r--r-- | src/libcollections/linked_list.rs | 20 |
2 files changed, 15 insertions, 7 deletions
diff --git a/src/libcollections/lib.rs b/src/libcollections/lib.rs index 000ec4f0f66..370857287d6 100644 --- a/src/libcollections/lib.rs +++ b/src/libcollections/lib.rs @@ -46,7 +46,7 @@ #![feature(num_bits_bytes)] #![feature(oom)] #![feature(pattern)] -#![feature(ptr_as_ref)] +#![feature(shared)] #![feature(slice_bytes)] #![feature(slice_patterns)] #![feature(staged_api)] diff --git a/src/libcollections/linked_list.rs b/src/libcollections/linked_list.rs index 631857f8e3c..1bd5a83d437 100644 --- a/src/libcollections/linked_list.rs +++ b/src/libcollections/linked_list.rs @@ -27,7 +27,7 @@ use core::fmt; use core::hash::{Hasher, Hash}; use core::iter::FromIterator; use core::mem; -use core::ptr; +use core::ptr::Shared; /// A doubly-linked list. #[stable(feature = "rust1", since = "1.0.0")] @@ -40,7 +40,7 @@ pub struct LinkedList<T> { type Link<T> = Option<Box<Node<T>>>; struct Rawlink<T> { - p: *mut T, + p: Option<Shared<T>>, } impl<T> Copy for Rawlink<T> {} @@ -93,12 +93,12 @@ pub struct IntoIter<T> { impl<T> Rawlink<T> { /// Like Option::None for Rawlink fn none() -> Rawlink<T> { - Rawlink { p: ptr::null_mut() } + Rawlink { p: None } } /// Like Option::Some for Rawlink fn some(n: &mut T) -> Rawlink<T> { - Rawlink { p: n } + unsafe { Rawlink { p: Some(Shared::new(n)) } } } /// Convert the `Rawlink` into an Option value @@ -108,7 +108,7 @@ impl<T> Rawlink<T> { /// - Dereference of raw pointer. /// - Returns reference of arbitrary lifetime. unsafe fn resolve<'a>(&self) -> Option<&'a T> { - self.p.as_ref() + self.p.map(|p| &**p) } /// Convert the `Rawlink` into an Option value @@ -118,7 +118,7 @@ impl<T> Rawlink<T> { /// - Dereference of raw pointer. /// - Returns reference of arbitrary lifetime. unsafe fn resolve_mut<'a>(&mut self) -> Option<&'a mut T> { - self.p.as_mut() + self.p.map(|p| &mut **p) } /// Return the `Rawlink` and replace with `Rawlink::none()` @@ -984,6 +984,14 @@ impl<A: Hash> Hash for LinkedList<A> { } } +// Ensure that `LinkedList` and its read-only iterators are covariant in their type parameters. +#[allow(dead_code)] +fn assert_covariance() { + fn a<'a>(x: LinkedList<&'static str>) -> LinkedList<&'a str> { x } + fn b<'i, 'a>(x: Iter<'i, &'static str>) -> Iter<'i, &'a str> { x } + fn c<'a>(x: IntoIter<&'static str>) -> IntoIter<&'a str> { x } +} + #[cfg(test)] mod tests { use std::clone::Clone; |
