Skip to content

Commit 5761fc7

Browse files
authored
Rollup merge of rust-lang#62744 - llogiq:tiny-list-refactor, r=eddyb
Refactor `TinyList::contains` and `len` to iterate instead of recurse None
2 parents eeba189 + 45f14a8 commit 5761fc7

File tree

2 files changed

+45
-46
lines changed

2 files changed

+45
-46
lines changed

src/librustc_data_structures/tiny_list.rs

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ pub struct TinyList<T: PartialEq> {
2020
}
2121

2222
impl<T: PartialEq> TinyList<T> {
23-
2423
#[inline]
2524
pub fn new() -> TinyList<T> {
2625
TinyList {
@@ -60,20 +59,24 @@ impl<T: PartialEq> TinyList<T> {
6059

6160
#[inline]
6261
pub fn contains(&self, data: &T) -> bool {
63-
if let Some(ref head) = self.head {
64-
head.contains(data)
65-
} else {
66-
false
62+
let mut elem = self.head.as_ref();
63+
while let Some(ref e) = elem {
64+
if &e.data == data {
65+
return true;
66+
}
67+
elem = e.next.as_ref().map(|e| &**e);
6768
}
69+
false
6870
}
6971

7072
#[inline]
7173
pub fn len(&self) -> usize {
72-
if let Some(ref head) = self.head {
73-
head.len()
74-
} else {
75-
0
74+
let (mut elem, mut count) = (self.head.as_ref(), 0);
75+
while let Some(ref e) = elem {
76+
count += 1;
77+
elem = e.next.as_ref().map(|e| &**e);
7678
}
79+
count
7780
}
7881
}
7982

@@ -84,40 +87,13 @@ struct Element<T: PartialEq> {
8487
}
8588

8689
impl<T: PartialEq> Element<T> {
87-
8890
fn remove_next(&mut self, data: &T) -> bool {
89-
let new_next = if let Some(ref mut next) = self.next {
90-
if next.data != *data {
91-
return next.remove_next(data)
92-
} else {
93-
next.next.take()
94-
}
95-
} else {
96-
return false
91+
let new_next = match self.next {
92+
Some(ref mut next) if next.data == *data => next.next.take(),
93+
Some(ref mut next) => return next.remove_next(data),
94+
None => return false,
9795
};
98-
9996
self.next = new_next;
100-
10197
true
10298
}
103-
104-
fn len(&self) -> usize {
105-
if let Some(ref next) = self.next {
106-
1 + next.len()
107-
} else {
108-
1
109-
}
110-
}
111-
112-
fn contains(&self, data: &T) -> bool {
113-
if self.data == *data {
114-
return true
115-
}
116-
117-
if let Some(ref next) = self.next {
118-
next.contains(data)
119-
} else {
120-
false
121-
}
122-
}
12399
}

src/librustc_data_structures/tiny_list/tests.rs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::*;
22

33
extern crate test;
4-
use test::Bencher;
4+
use test::{Bencher, black_box};
55

66
#[test]
77
fn test_contains_and_insert() {
@@ -98,36 +98,59 @@ fn test_remove_single() {
9898
#[bench]
9999
fn bench_insert_empty(b: &mut Bencher) {
100100
b.iter(|| {
101-
let mut list = TinyList::new();
101+
let mut list = black_box(TinyList::new());
102102
list.insert(1);
103+
list
103104
})
104105
}
105106

106107
#[bench]
107108
fn bench_insert_one(b: &mut Bencher) {
108109
b.iter(|| {
109-
let mut list = TinyList::new_single(0);
110+
let mut list = black_box(TinyList::new_single(0));
110111
list.insert(1);
112+
list
111113
})
112114
}
113115

116+
#[bench]
117+
fn bench_contains_empty(b: &mut Bencher) {
118+
b.iter(|| {
119+
black_box(TinyList::new()).contains(&1)
120+
});
121+
}
122+
123+
#[bench]
124+
fn bench_contains_unknown(b: &mut Bencher) {
125+
b.iter(|| {
126+
black_box(TinyList::new_single(0)).contains(&1)
127+
});
128+
}
129+
130+
#[bench]
131+
fn bench_contains_one(b: &mut Bencher) {
132+
b.iter(|| {
133+
black_box(TinyList::new_single(1)).contains(&1)
134+
});
135+
}
136+
114137
#[bench]
115138
fn bench_remove_empty(b: &mut Bencher) {
116139
b.iter(|| {
117-
TinyList::new().remove(&1)
140+
black_box(TinyList::new()).remove(&1)
118141
});
119142
}
120143

121144
#[bench]
122145
fn bench_remove_unknown(b: &mut Bencher) {
123146
b.iter(|| {
124-
TinyList::new_single(0).remove(&1)
147+
black_box(TinyList::new_single(0)).remove(&1)
125148
});
126149
}
127150

128151
#[bench]
129152
fn bench_remove_one(b: &mut Bencher) {
130153
b.iter(|| {
131-
TinyList::new_single(1).remove(&1)
154+
black_box(TinyList::new_single(1)).remove(&1)
132155
});
133156
}

0 commit comments

Comments
 (0)