Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit d3c70b8

Browse files
committed
rustc_data_structures: use IndexSet in TransitiveRelation
1 parent 1f71f0f commit d3c70b8

File tree

1 file changed

+13
-26
lines changed

1 file changed

+13
-26
lines changed

src/librustc_data_structures/transitive_relation.rs

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::fx::FxHashMap;
1+
use crate::fx::FxIndexSet;
22
use crate::stable_hasher::{HashStable, StableHasher};
33
use crate::sync::Lock;
44
use rustc_index::bit_set::BitMatrix;
@@ -13,10 +13,7 @@ mod tests;
1313
#[derive(Clone, Debug)]
1414
pub struct TransitiveRelation<T: Eq + Hash> {
1515
// List of elements. This is used to map from a T to a usize.
16-
elements: Vec<T>,
17-
18-
// Maps each element to an index.
19-
map: FxHashMap<T, Index>,
16+
elements: FxIndexSet<T>,
2017

2118
// List of base edges in the graph. Require to compute transitive
2219
// closure.
@@ -39,7 +36,6 @@ impl<T: Eq + Hash> Default for TransitiveRelation<T> {
3936
fn default() -> Self {
4037
TransitiveRelation {
4138
elements: Default::default(),
42-
map: Default::default(),
4339
edges: Default::default(),
4440
closure: Default::default(),
4541
}
@@ -65,20 +61,16 @@ impl<T: Clone + Debug + Eq + Hash> TransitiveRelation<T> {
6561
}
6662

6763
fn index(&self, a: &T) -> Option<Index> {
68-
self.map.get(a).cloned()
64+
self.elements.get_index_of(a).map(Index)
6965
}
7066

7167
fn add_index(&mut self, a: T) -> Index {
72-
let &mut TransitiveRelation { ref mut elements, ref mut closure, ref mut map, .. } = self;
73-
74-
*map.entry(a.clone()).or_insert_with(|| {
75-
elements.push(a);
76-
68+
let (index, added) = self.elements.insert_full(a);
69+
if added {
7770
// if we changed the dimensions, clear the cache
78-
*closure.get_mut() = None;
79-
80-
Index(elements.len() - 1)
81-
})
71+
*self.closure.get_mut() = None;
72+
}
73+
Index(index)
8274
}
8375

8476
/// Applies the (partial) function to each edge and returns a new
@@ -430,14 +422,11 @@ where
430422
{
431423
fn decode<D: Decoder>(d: &mut D) -> Result<Self, D::Error> {
432424
d.read_struct("TransitiveRelation", 2, |d| {
433-
let elements: Vec<T> = d.read_struct_field("elements", 0, |d| Decodable::decode(d))?;
434-
let edges = d.read_struct_field("edges", 1, |d| Decodable::decode(d))?;
435-
let map = elements
436-
.iter()
437-
.enumerate()
438-
.map(|(index, elem)| (elem.clone(), Index(index)))
439-
.collect();
440-
Ok(TransitiveRelation { elements, edges, map, closure: Lock::new(None) })
425+
Ok(TransitiveRelation {
426+
elements: d.read_struct_field("elements", 0, |d| Decodable::decode(d))?,
427+
edges: d.read_struct_field("edges", 1, |d| Decodable::decode(d))?,
428+
closure: Lock::new(None),
429+
})
441430
})
442431
}
443432
}
@@ -452,8 +441,6 @@ where
452441
let TransitiveRelation {
453442
ref elements,
454443
ref edges,
455-
// "map" is just a copy of elements vec
456-
map: _,
457444
// "closure" is just a copy of the data above
458445
closure: _,
459446
} = *self;

0 commit comments

Comments
 (0)