Short-circuit DefIdForest::intersection()
If the forest is already empty, there is no point in intersecting further. Also handle the first element separately, so we don't compute an unnecessary intersection between the full forest and the first element, which is always equal to the first element.
This commit is contained in:
parent
9689ada838
commit
f93cbf6170
1 changed files with 12 additions and 1 deletions
|
|
@ -74,10 +74,21 @@ impl<'a, 'gcx, 'tcx> DefIdForest {
|
|||
iter: I) -> DefIdForest
|
||||
where I: IntoIterator<Item=DefIdForest>
|
||||
{
|
||||
let mut ret = DefIdForest::full(tcx);
|
||||
let mut iter = iter.into_iter();
|
||||
let mut ret = if let Some(first) = iter.next() {
|
||||
first
|
||||
} else {
|
||||
return DefIdForest::full(tcx);
|
||||
};
|
||||
|
||||
let mut next_ret = SmallVec::new();
|
||||
let mut old_ret: SmallVec<[DefId; 1]> = SmallVec::new();
|
||||
for next_forest in iter {
|
||||
// No need to continue if the intersection is already empty.
|
||||
if ret.is_empty() {
|
||||
break;
|
||||
}
|
||||
|
||||
for id in ret.root_ids.drain() {
|
||||
if next_forest.contains(tcx, id) {
|
||||
next_ret.push(id);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue