diff options
| author | bors <bors@rust-lang.org> | 2014-09-25 03:32:36 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-09-25 03:32:36 +0000 |
| commit | 5e13d3aa00e8cfdf1a64f58f6c649460400231c0 (patch) | |
| tree | da2ed103b766692d01b7905b2ffc43e028bf8c7d /src/libsyntax | |
| parent | 4d69696ff62fb9f069fd8f64eaa0defe4c8c9cf7 (diff) | |
| parent | fe8a413fc0f5d7d021ec42ac1a4149db662ca92c (diff) | |
| download | rust-5e13d3aa00e8cfdf1a64f58f6c649460400231c0.tar.gz rust-5e13d3aa00e8cfdf1a64f58f6c649460400231c0.zip | |
auto merge of #17378 : Gankro/rust/hashmap-entry, r=aturon
Deprecates the `find_or_*` family of "internal mutation" methods on `HashMap` in favour of the "external mutation" Entry API as part of RFC 60. Part of #17320, but this still needs to be done on the rest of the maps. However they don't have any internal mutation methods defined, so they can be done without deprecating or breaking anything. Work on `BTree` is part of the complete rewrite in #17334. The implemented API deviates from the API described in the RFC in two key places: * `VacantEntry.set` yields a mutable reference to the inserted element to avoid code duplication where complex logic needs to be done *regardless* of whether the entry was vacant or not. * `OccupiedEntry.into_mut` was added so that it is possible to return a reference into the map beyond the lifetime of the Entry itself, providing functional parity to `VacantEntry.set`. This allows the full find_or_insert functionality to be implemented using this API. A PR will be submitted to the RFC to amend this. [breaking-change]
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/mtwt.rs | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/libsyntax/ext/mtwt.rs b/src/libsyntax/ext/mtwt.rs index 2c94db52967..6fe4f5b324c 100644 --- a/src/libsyntax/ext/mtwt.rs +++ b/src/libsyntax/ext/mtwt.rs @@ -20,6 +20,7 @@ use ast::{Ident, Mrk, Name, SyntaxContext}; use std::cell::RefCell; use std::rc::Rc; use std::collections::HashMap; +use std::collections::hashmap::{Occupied, Vacant}; /// The SCTable contains a table of SyntaxContext_'s. It /// represents a flattened tree structure, to avoid having @@ -65,10 +66,10 @@ pub fn apply_mark(m: Mrk, ctxt: SyntaxContext) -> SyntaxContext { /// Extend a syntax context with a given mark and sctable (explicit memoization) fn apply_mark_internal(m: Mrk, ctxt: SyntaxContext, table: &SCTable) -> SyntaxContext { let key = (ctxt, m); - let new_ctxt = |_: &(SyntaxContext, Mrk)| - idx_push(&mut *table.table.borrow_mut(), Mark(m, ctxt)); - - *table.mark_memo.borrow_mut().find_or_insert_with(key, new_ctxt) + * match table.mark_memo.borrow_mut().entry(key) { + Vacant(entry) => entry.set(idx_push(&mut *table.table.borrow_mut(), Mark(m, ctxt))), + Occupied(entry) => entry.into_mut(), + } } /// Extend a syntax context with a given rename @@ -83,10 +84,11 @@ fn apply_rename_internal(id: Ident, ctxt: SyntaxContext, table: &SCTable) -> SyntaxContext { let key = (ctxt, id, to); - let new_ctxt = |_: &(SyntaxContext, Ident, Name)| - idx_push(&mut *table.table.borrow_mut(), Rename(id, to, ctxt)); - *table.rename_memo.borrow_mut().find_or_insert_with(key, new_ctxt) + * match table.rename_memo.borrow_mut().entry(key) { + Vacant(entry) => entry.set(idx_push(&mut *table.table.borrow_mut(), Rename(id, to, ctxt))), + Occupied(entry) => entry.into_mut(), + } } /// Apply a list of renamings to a context |
