rt_lists/
third.rs

1
2type Link<T> = Option<Box<Node<T>>>;
3
4struct  Node<T> {
5  elem: T,
6  next: Link<T>
7}
8
9pub struct List<T> {
10  head: Link<T>
11}
12
13pub struct IntoIter<T>(List<T>);
14
15pub struct  Iter<'a, T> {
16  next: Option<&'a Box<Node<T>>>,
17}
18
19pub struct IterMut<'a, T> {
20  next: Option<&'a mut Node<T>>
21}
22
23impl<T> List<T> {
24  pub fn new() -> Self {
25    List { head: None }
26  }
27
28  pub fn push(&mut self, elem: T) {
29    let new_node = Box::new(Node {
30      elem: elem,
31      next: self.head.take(),
32    });
33
34    self.head = Some(new_node);
35  }
36
37  pub fn pop(&mut self) -> Option<T> {
38    self.head.take().map(|node| {
39      self.head = node.next;
40      node.elem
41    })
42  }
43
44  pub fn peek(&self) -> Option<&T> {
45    self.head.as_ref().map(|node| {
46      &node.elem
47    })
48  }
49
50  pub fn peek_mut(&mut self) -> Option<&mut T> {
51    self.head.as_mut().map(|node| {
52      &mut node.elem
53    })
54  }
55
56  pub fn into_iter(self) -> IntoIter<T> {
57    IntoIter(self)
58  }
59
60  pub fn iter(&self) -> Iter<T> {
61    Iter { next: self.head.as_ref().map(|node| &*node) }
62  }
63
64  pub fn iter_mut(&mut self) -> IterMut<T> {
65    IterMut { next: self.head.as_deref_mut() }
66  }
67}
68
69
70
71impl<T> Drop for List<T>  {
72  fn drop(&mut self) {
73    let mut cur_link = self.head.take();
74    while let Some(mut boxed_node) = cur_link {
75      cur_link = boxed_node.next.take();
76    }
77  }
78}
79
80impl<T> Iterator for IntoIter<T>  {
81  type Item = T;
82  fn next(&mut self) -> Option<Self::Item> {
83    // access fields of a tuple struct numerically
84    self.0.pop()
85  }
86}
87
88impl<'a, T> Iterator for Iter<'a, T>  {
89  type Item = &'a T;
90
91  fn next(&mut self) -> Option<Self::Item> {
92    self.next.map(|node| {
93      self.next = node.next.as_ref().map(|node| &*node);
94      &node.elem
95    })
96  }
97}
98
99impl<'a, T> Iterator for IterMut<'a, T> {
100  type Item = &'a mut T;
101
102  fn next(&mut self) -> Option<Self::Item> {
103    self.next.take().map(|node| {
104      self.next = node.next.as_deref_mut();
105      &mut node.elem
106    })
107  }
108}