}
impl NoAliasSingleton {
+ pub fn as_ref<'a>(&'a mut self) -> NoAlias<'a> {
+ NoAlias(PhantomData)
+ }
pub fn as_mut<'a>(&'a mut self) -> NoAlias<'a> {
NoAlias(PhantomData)
}
if self.head.is_none() { self.head = Some(node) };
}
+ pub fn front(&self) -> Option<&T> {
+ let noalias = self.noalias.as_ref();
+ let head = self.head?;
+ Some(self.head.borrow(noalias))
+ }
+
+ pub fn front_mut(&mut self) -> Option<&T> {
+ let noalias = self.noalias.as_mut();
+ let head = self.head?;
+ Some(self.head.borrow_mut(noalias))
+ }
+
pub fn pop_front(&mut self) -> Option<T> {
let mut noalias = self.noalias.as_mut();
let noalias = &mut noalias;
+ self.pop_front_inner(
+ noalias,
+ &mut self.head,
+ &mut self.tail,
+ )
+ }
- let deleting = self.head?;
+ // We wouldn't do this, since it's daft, but
+ // it lets us demonstrate passing a NoAlias.
+ fn pop_front_inner(
+ noalias: NoAlias,
+ head: &mut Option<Ptr<T>>,
+ tail: &mut Option<Ptr<T>>,
+ ) -> Option<T> {
+ let deleting = *head?;
let new_head = deleting.borrow(noalias).next;
- self.head = new_head;
+ *head = new_head;
if let Some(new_head) = new_head {
new_head.borrow_mut(noalias).back = None;
} else {
- self.tail = None;
+ *tail = None;
}
let deleted = unsafe { deleting.free_heap(noalias) };
Some(deleted.data)
impl<T> Drop for List<T> {
fn drop(&mut self) {
- while let Some(_) = self.pop_front() { }
+ while let Some(_) = Self::pop_front_inner(
+ self.noalias.as_mut(),
+ &mut self.head,
+ &mut self.tail,
+ ) { }
}
}
}
use list::List;
let l = List::<String>::new();
+ assert_eq!(l.front(), None);
drop(l);
let mut l = List::new();
l.append(format!("hi"));
l.append(format!("ho"));
+ assert_eq!(l.front(), Some("hi"));
drop(l);
}
}