Trait rustc::util::common::MemoizationMap
[−]
[src]
pub trait MemoizationMap { type Key: Clone; type Value: Clone; fn memoize<OP>(&self, key: Self::Key, op: OP) -> Self::Value
where
OP: FnOnce() -> Self::Value; }
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?
Associated Types
type Key: Clone
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?
type Value: Clone
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?
Required Methods
fn memoize<OP>(&self, key: Self::Key, op: OP) -> Self::Value where
OP: FnOnce() -> Self::Value,
OP: FnOnce() -> Self::Value,
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?
If key
is present in the map, return the value,
otherwise invoke op
and store the value in the map.
NB: if the receiver is a DepTrackingMap
, special care is
needed in the op
to ensure that the correct edges are
added into the dep graph. See the DepTrackingMap
impl for
more details!
Implementations on Foreign Types
impl<M: DepTrackingMapConfig> MemoizationMap for RefCell<DepTrackingMap<M>>
[src]
type Key = M::Key
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?
type Value = M::Value
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?
fn memoize<OP>(&self, key: M::Key, op: OP) -> M::Value where
OP: FnOnce() -> M::Value,
[src]
OP: FnOnce() -> M::Value,
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?
Memoizes an entry in the dep-tracking-map. If the entry is not
already present, then op
will be executed to compute its value.
The resulting dependency graph looks like this:
[op] -> Map(key) -> CurrentTask
Here, [op]
represents whatever nodes op
reads in the
course of execution; Map(key)
represents the node for this
map; and CurrentTask
represents the current task when
memoize
is invoked.
**Important:* when op
is invoked, the current task will be
switched to Map(key)
. Therefore, if op
makes use of any
HIR nodes or shared state accessed through its closure
environment, it must explicitly register a read of that
state. As an example, see type_of_item
in collect
,
which looks something like this:
fn type_of_item(..., item: &hir::Item) -> Ty<'tcx> { let item_def_id = ccx.tcx.hir.local_def_id(it.id); ccx.tcx.item_types.memoized(item_def_id, || { ccx.tcx.dep_graph.read(DepNode::Hir(item_def_id)); // (*) compute_type_of_item(ccx, item) }); }
The key is the line marked (*)
: the closure implicitly
accesses the body of the item item
, so we register a read
from Hir(item_def_id)
.
impl<K, V, S> MemoizationMap for RefCell<HashMap<K, V, S>> where
K: Hash + Eq + Clone,
V: Clone,
S: BuildHasher,
[src]
K: Hash + Eq + Clone,
V: Clone,
S: BuildHasher,
type Key = K
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?
type Value = V
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?
fn memoize<OP>(&self, key: K, op: OP) -> V where
OP: FnOnce() -> V,
[src]
OP: FnOnce() -> V,
🔬 This is a nightly-only experimental API. (rustc_private
)
this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml
instead?