441dc3640a
Found with https://github.com/est31/warnalyzer. Dubious changes: - Is anyone else using rustc_apfloat? I feel weird completely deleting x87 support. - Maybe some of the dead code in rustc_data_structures, in case someone wants to use it in the future? - Don't change rustc_serialize I plan to scrap most of the json module in the near future (see https://github.com/rust-lang/compiler-team/issues/418) and fixing the tests needed more work than I expected. TODO: check if any of the comments on the deleted code should be kept.
54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
//! Cache for candidate selection.
|
|
|
|
use crate::dep_graph::{DepContext, DepNodeIndex};
|
|
|
|
use rustc_data_structures::fx::FxHashMap;
|
|
use rustc_data_structures::sync::Lock;
|
|
|
|
use std::hash::Hash;
|
|
|
|
#[derive(Clone)]
|
|
pub struct Cache<Key, Value> {
|
|
hashmap: Lock<FxHashMap<Key, WithDepNode<Value>>>,
|
|
}
|
|
|
|
impl<Key, Value> Default for Cache<Key, Value> {
|
|
fn default() -> Self {
|
|
Self { hashmap: Default::default() }
|
|
}
|
|
}
|
|
|
|
impl<Key, Value> Cache<Key, Value> {
|
|
/// Actually frees the underlying memory in contrast to what stdlib containers do on `clear`
|
|
pub fn clear(&self) {
|
|
*self.hashmap.borrow_mut() = Default::default();
|
|
}
|
|
}
|
|
|
|
impl<Key: Eq + Hash, Value: Clone> Cache<Key, Value> {
|
|
pub fn get<CTX: DepContext>(&self, key: &Key, tcx: CTX) -> Option<Value> {
|
|
Some(self.hashmap.borrow().get(key)?.get(tcx))
|
|
}
|
|
|
|
pub fn insert(&self, key: Key, dep_node: DepNodeIndex, value: Value) {
|
|
self.hashmap.borrow_mut().insert(key, WithDepNode::new(dep_node, value));
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Eq, PartialEq)]
|
|
pub struct WithDepNode<T> {
|
|
dep_node: DepNodeIndex,
|
|
cached_value: T,
|
|
}
|
|
|
|
impl<T: Clone> WithDepNode<T> {
|
|
pub fn new(dep_node: DepNodeIndex, cached_value: T) -> Self {
|
|
WithDepNode { dep_node, cached_value }
|
|
}
|
|
|
|
pub fn get<CTX: DepContext>(&self, tcx: CTX) -> T {
|
|
tcx.dep_graph().read_index(self.dep_node);
|
|
self.cached_value.clone()
|
|
}
|
|
}
|