diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2019-12-12 10:09:29 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-12-12 10:09:29 +0900 |
| commit | 685d4cc7463afe2674dac4ac4298c93157965c2a (patch) | |
| tree | 5552e1ad7152ac5aab3a9e11d1e09fdf62ca5223 | |
| parent | 60ebeda94f0ca7caf8cecf29cc3196b3dbd01b31 (diff) | |
| parent | ab3afc0f0426ea7e2801043a874dd96b2831a1eb (diff) | |
| download | rust-685d4cc7463afe2674dac4ac4298c93157965c2a.tar.gz rust-685d4cc7463afe2674dac4ac4298c93157965c2a.zip | |
Rollup merge of #67239 - llogiq:tiny-list-iterative-remove, r=Mark-Simulacrum
Make TinyList::remove iterate instead of recurse Most of the diff is from from rustfmt, the actual change is in line 91..79 (or 79..89 in the "after" diff). I had converted the other methods to iterate instead of recurse already, so this is the last recursive function on `TinyList`.
| -rw-r--r-- | src/librustc_data_structures/tiny_list.rs | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/src/librustc_data_structures/tiny_list.rs b/src/librustc_data_structures/tiny_list.rs index 371f0f6fa0b..78cbc1240b1 100644 --- a/src/librustc_data_structures/tiny_list.rs +++ b/src/librustc_data_structures/tiny_list.rs @@ -16,41 +16,29 @@ mod tests; #[derive(Clone)] pub struct TinyList<T: PartialEq> { - head: Option<Element<T>> + head: Option<Element<T>>, } impl<T: PartialEq> TinyList<T> { #[inline] pub fn new() -> TinyList<T> { - TinyList { - head: None - } + TinyList { head: None } } #[inline] pub fn new_single(data: T) -> TinyList<T> { - TinyList { - head: Some(Element { - data, - next: None, - }) - } + TinyList { head: Some(Element { data, next: None }) } } #[inline] pub fn insert(&mut self, data: T) { - self.head = Some(Element { - data, - next: self.head.take().map(Box::new) - }); + self.head = Some(Element { data, next: self.head.take().map(Box::new) }); } #[inline] pub fn remove(&mut self, data: &T) -> bool { self.head = match self.head { - Some(ref mut head) if head.data == *data => { - head.next.take().map(|x| *x) - } + Some(ref mut head) if head.data == *data => head.next.take().map(|x| *x), Some(ref mut head) => return head.remove_next(data), None => return false, }; @@ -88,12 +76,16 @@ struct Element<T: PartialEq> { impl<T: PartialEq> Element<T> { fn remove_next(&mut self, data: &T) -> bool { - let new_next = match self.next { - Some(ref mut next) if next.data == *data => next.next.take(), - Some(ref mut next) => return next.remove_next(data), - None => return false, - }; - self.next = new_next; - true + let mut n = self; + loop { + match n.next { + Some(ref mut next) if next.data == *data => { + n.next = next.next.take(); + return true; + } + Some(ref mut next) => n = next, + None => return false, + } + } } } |
