Rollup merge of #62744 - llogiq:tiny-list-refactor, r=eddyb

Refactor `TinyList::contains` and `len` to iterate instead of recurse

None
This commit is contained in:
Mazdak Farrokhzad 2019-08-25 02:44:58 +02:00 committed by GitHub
commit 5761fc759a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 46 deletions

View File

@ -20,7 +20,6 @@ pub struct TinyList<T: PartialEq> {
}
impl<T: PartialEq> TinyList<T> {
#[inline]
pub fn new() -> TinyList<T> {
TinyList {
@ -60,20 +59,24 @@ impl<T: PartialEq> TinyList<T> {
#[inline]
pub fn contains(&self, data: &T) -> bool {
if let Some(ref head) = self.head {
head.contains(data)
} else {
false
let mut elem = self.head.as_ref();
while let Some(ref e) = elem {
if &e.data == data {
return true;
}
elem = e.next.as_ref().map(|e| &**e);
}
false
}
#[inline]
pub fn len(&self) -> usize {
if let Some(ref head) = self.head {
head.len()
} else {
0
let (mut elem, mut count) = (self.head.as_ref(), 0);
while let Some(ref e) = elem {
count += 1;
elem = e.next.as_ref().map(|e| &**e);
}
count
}
}
@ -84,40 +87,13 @@ struct Element<T: PartialEq> {
}
impl<T: PartialEq> Element<T> {
fn remove_next(&mut self, data: &T) -> bool {
let new_next = if let Some(ref mut next) = self.next {
if next.data != *data {
return next.remove_next(data)
} else {
next.next.take()
}
} else {
return false
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
}
fn len(&self) -> usize {
if let Some(ref next) = self.next {
1 + next.len()
} else {
1
}
}
fn contains(&self, data: &T) -> bool {
if self.data == *data {
return true
}
if let Some(ref next) = self.next {
next.contains(data)
} else {
false
}
}
}

View File

@ -1,7 +1,7 @@
use super::*;
extern crate test;
use test::Bencher;
use test::{Bencher, black_box};
#[test]
fn test_contains_and_insert() {
@ -98,36 +98,59 @@ fn test_remove_single() {
#[bench]
fn bench_insert_empty(b: &mut Bencher) {
b.iter(|| {
let mut list = TinyList::new();
let mut list = black_box(TinyList::new());
list.insert(1);
list
})
}
#[bench]
fn bench_insert_one(b: &mut Bencher) {
b.iter(|| {
let mut list = TinyList::new_single(0);
let mut list = black_box(TinyList::new_single(0));
list.insert(1);
list
})
}
#[bench]
fn bench_contains_empty(b: &mut Bencher) {
b.iter(|| {
black_box(TinyList::new()).contains(&1)
});
}
#[bench]
fn bench_contains_unknown(b: &mut Bencher) {
b.iter(|| {
black_box(TinyList::new_single(0)).contains(&1)
});
}
#[bench]
fn bench_contains_one(b: &mut Bencher) {
b.iter(|| {
black_box(TinyList::new_single(1)).contains(&1)
});
}
#[bench]
fn bench_remove_empty(b: &mut Bencher) {
b.iter(|| {
TinyList::new().remove(&1)
black_box(TinyList::new()).remove(&1)
});
}
#[bench]
fn bench_remove_unknown(b: &mut Bencher) {
b.iter(|| {
TinyList::new_single(0).remove(&1)
black_box(TinyList::new_single(0)).remove(&1)
});
}
#[bench]
fn bench_remove_one(b: &mut Bencher) {
b.iter(|| {
TinyList::new_single(1).remove(&1)
black_box(TinyList::new_single(1)).remove(&1)
});
}