Make IndexVec::ensure_contains_elem return a reference to the element

This commit is contained in:
Maybe Waffle 2023-04-17 13:14:03 +00:00
parent e49122fb1c
commit e1cd99f6ff
6 changed files with 24 additions and 26 deletions

View file

@ -89,9 +89,9 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
lctx.with_hir_id_owner(owner, |lctx| f(lctx)); lctx.with_hir_id_owner(owner, |lctx| f(lctx));
for (def_id, info) in lctx.children { for (def_id, info) in lctx.children {
self.owners.ensure_contains_elem(def_id, || hir::MaybeOwner::Phantom); let owner = self.owners.ensure_contains_elem(def_id, || hir::MaybeOwner::Phantom);
debug_assert!(matches!(self.owners[def_id], hir::MaybeOwner::Phantom)); debug_assert!(matches!(owner, hir::MaybeOwner::Phantom));
self.owners[def_id] = info; *owner = info;
} }
} }
@ -99,8 +99,8 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
&mut self, &mut self,
def_id: LocalDefId, def_id: LocalDefId,
) -> hir::MaybeOwner<&'hir hir::OwnerInfo<'hir>> { ) -> hir::MaybeOwner<&'hir hir::OwnerInfo<'hir>> {
self.owners.ensure_contains_elem(def_id, || hir::MaybeOwner::Phantom); let owner = self.owners.ensure_contains_elem(def_id, || hir::MaybeOwner::Phantom);
if let hir::MaybeOwner::Phantom = self.owners[def_id] { if let hir::MaybeOwner::Phantom = owner {
let node = self.ast_index[def_id]; let node = self.ast_index[def_id];
match node { match node {
AstOwner::NonOwner => {} AstOwner::NonOwner => {}

View file

@ -368,8 +368,8 @@ fn index_crate<'a>(
krate: &'a Crate, krate: &'a Crate,
) -> IndexVec<LocalDefId, AstOwner<'a>> { ) -> IndexVec<LocalDefId, AstOwner<'a>> {
let mut indexer = Indexer { node_id_to_def_id, index: IndexVec::new() }; let mut indexer = Indexer { node_id_to_def_id, index: IndexVec::new() };
indexer.index.ensure_contains_elem(CRATE_DEF_ID, || AstOwner::NonOwner); *indexer.index.ensure_contains_elem(CRATE_DEF_ID, || AstOwner::NonOwner) =
indexer.index[CRATE_DEF_ID] = AstOwner::Crate(krate); AstOwner::Crate(krate);
visit::walk_crate(&mut indexer, krate); visit::walk_crate(&mut indexer, krate);
return indexer.index; return indexer.index;
@ -386,22 +386,21 @@ fn index_crate<'a>(
fn visit_item(&mut self, item: &'a ast::Item) { fn visit_item(&mut self, item: &'a ast::Item) {
let def_id = self.node_id_to_def_id[&item.id]; let def_id = self.node_id_to_def_id[&item.id];
self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner); *self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner) = AstOwner::Item(item);
self.index[def_id] = AstOwner::Item(item);
visit::walk_item(self, item) visit::walk_item(self, item)
} }
fn visit_assoc_item(&mut self, item: &'a ast::AssocItem, ctxt: visit::AssocCtxt) { fn visit_assoc_item(&mut self, item: &'a ast::AssocItem, ctxt: visit::AssocCtxt) {
let def_id = self.node_id_to_def_id[&item.id]; let def_id = self.node_id_to_def_id[&item.id];
self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner); *self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner) =
self.index[def_id] = AstOwner::AssocItem(item, ctxt); AstOwner::AssocItem(item, ctxt);
visit::walk_assoc_item(self, item, ctxt); visit::walk_assoc_item(self, item, ctxt);
} }
fn visit_foreign_item(&mut self, item: &'a ast::ForeignItem) { fn visit_foreign_item(&mut self, item: &'a ast::ForeignItem) {
let def_id = self.node_id_to_def_id[&item.id]; let def_id = self.node_id_to_def_id[&item.id];
self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner); *self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner) =
self.index[def_id] = AstOwner::ForeignItem(item); AstOwner::ForeignItem(item);
visit::walk_foreign_item(self, item); visit::walk_foreign_item(self, item);
} }
} }

View file

@ -268,8 +268,7 @@ impl DropRangesBuilder {
fn node_mut(&mut self, id: PostOrderId) -> &mut NodeInfo { fn node_mut(&mut self, id: PostOrderId) -> &mut NodeInfo {
let size = self.num_values(); let size = self.num_values();
self.nodes.ensure_contains_elem(id, || NodeInfo::new(size)); self.nodes.ensure_contains_elem(id, || NodeInfo::new(size))
&mut self.nodes[id]
} }
fn add_control_edge(&mut self, from: PostOrderId, to: PostOrderId) { fn add_control_edge(&mut self, from: PostOrderId, to: PostOrderId) {

View file

@ -261,8 +261,7 @@ impl<R: Idx, C: Step + Idx> SparseIntervalMatrix<R, C> {
} }
fn ensure_row(&mut self, row: R) -> &mut IntervalSet<C> { fn ensure_row(&mut self, row: R) -> &mut IntervalSet<C> {
self.rows.ensure_contains_elem(row, || IntervalSet::new(self.column_size)); self.rows.ensure_contains_elem(row, || IntervalSet::new(self.column_size))
&mut self.rows[row]
} }
pub fn union_row(&mut self, row: R, from: &IntervalSet<C>) -> bool pub fn union_row(&mut self, row: R, from: &IntervalSet<C>) -> bool

View file

@ -236,12 +236,16 @@ impl<I: Idx, T> IndexVec<I, T> {
/// `elem`; if that is already true, then has no /// `elem`; if that is already true, then has no
/// effect. Otherwise, inserts new values as needed by invoking /// effect. Otherwise, inserts new values as needed by invoking
/// `fill_value`. /// `fill_value`.
///
/// Returns a reference to the `elem` entry.
#[inline] #[inline]
pub fn ensure_contains_elem(&mut self, elem: I, fill_value: impl FnMut() -> T) { pub fn ensure_contains_elem(&mut self, elem: I, fill_value: impl FnMut() -> T) -> &mut T {
let min_new_len = elem.index() + 1; let min_new_len = elem.index() + 1;
if self.len() < min_new_len { if self.len() < min_new_len {
self.raw.resize_with(min_new_len, fill_value); self.raw.resize_with(min_new_len, fill_value);
} }
&mut self[elem]
} }
#[inline] #[inline]
@ -446,20 +450,17 @@ impl<I: Idx, J: Idx> IndexSlice<I, J> {
impl<I: Idx, T> IndexVec<I, Option<T>> { impl<I: Idx, T> IndexVec<I, Option<T>> {
#[inline] #[inline]
pub fn insert(&mut self, index: I, value: T) -> Option<T> { pub fn insert(&mut self, index: I, value: T) -> Option<T> {
self.ensure_contains_elem(index, || None); self.ensure_contains_elem(index, || None).replace(value)
self[index].replace(value)
} }
#[inline] #[inline]
pub fn get_or_insert_with(&mut self, index: I, value: impl FnOnce() -> T) -> &mut T { pub fn get_or_insert_with(&mut self, index: I, value: impl FnOnce() -> T) -> &mut T {
self.ensure_contains_elem(index, || None); self.ensure_contains_elem(index, || None).get_or_insert_with(value)
self[index].get_or_insert_with(value)
} }
#[inline] #[inline]
pub fn remove(&mut self, index: I) -> Option<T> { pub fn remove(&mut self, index: I) -> Option<T> {
self.ensure_contains_elem(index, || None); self.ensure_contains_elem(index, || None).take()
self[index].take()
} }
} }

View file

@ -413,8 +413,8 @@ impl<I: Idx, const N: usize, T: FixedSizeEncoding<ByteArray = [u8; N]>> TableBui
// > Space requirements could perhaps be optimized by using the HAMT `popcnt` // > Space requirements could perhaps be optimized by using the HAMT `popcnt`
// > trick (i.e. divide things into buckets of 32 or 64 items and then // > trick (i.e. divide things into buckets of 32 or 64 items and then
// > store bit-masks of which item in each bucket is actually serialized). // > store bit-masks of which item in each bucket is actually serialized).
self.blocks.ensure_contains_elem(i, || [0; N]); let block = self.blocks.ensure_contains_elem(i, || [0; N]);
value.write_to_bytes(&mut self.blocks[i]); value.write_to_bytes(block);
} }
} }