Use Key impl to select cache.
This commit is contained in:
parent
ade5cffc2b
commit
bc9a202a22
4 changed files with 47 additions and 13 deletions
|
@ -12,6 +12,14 @@ use rustc_index::vec::{Idx, IndexVec};
|
|||
use std::default::Default;
|
||||
use std::fmt::Debug;
|
||||
use std::hash::Hash;
|
||||
use std::marker::PhantomData;
|
||||
|
||||
pub trait CacheSelector<'tcx, V> {
|
||||
type Cache
|
||||
where
|
||||
V: Clone;
|
||||
type ArenaCache;
|
||||
}
|
||||
|
||||
pub trait QueryStorage {
|
||||
type Value: Debug;
|
||||
|
@ -43,6 +51,15 @@ pub trait QueryCache: QueryStorage + Sized {
|
|||
fn iter(&self, f: &mut dyn FnMut(&Self::Key, &Self::Value, DepNodeIndex));
|
||||
}
|
||||
|
||||
pub struct DefaultCacheSelector<K>(PhantomData<K>);
|
||||
|
||||
impl<'tcx, K: Eq + Hash, V: 'tcx> CacheSelector<'tcx, V> for DefaultCacheSelector<K> {
|
||||
type Cache = DefaultCache<K, V>
|
||||
where
|
||||
V: Clone;
|
||||
type ArenaCache = ArenaCache<'tcx, K, V>;
|
||||
}
|
||||
|
||||
pub struct DefaultCache<K, V> {
|
||||
#[cfg(parallel_compiler)]
|
||||
cache: Sharded<FxHashMap<K, (V, DepNodeIndex)>>,
|
||||
|
@ -209,6 +226,15 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
pub struct VecCacheSelector<K>(PhantomData<K>);
|
||||
|
||||
impl<'tcx, K: Idx, V: 'tcx> CacheSelector<'tcx, V> for VecCacheSelector<K> {
|
||||
type Cache = VecCache<K, V>
|
||||
where
|
||||
V: Clone;
|
||||
type ArenaCache = VecArenaCache<'tcx, K, V>;
|
||||
}
|
||||
|
||||
pub struct VecCache<K: Idx, V> {
|
||||
#[cfg(parallel_compiler)]
|
||||
cache: Sharded<IndexVec<K, Option<(V, DepNodeIndex)>>>,
|
||||
|
|
|
@ -8,7 +8,7 @@ pub use self::job::{print_query_stack, QueryInfo, QueryJob, QueryJobId, QueryJob
|
|||
|
||||
mod caches;
|
||||
pub use self::caches::{
|
||||
ArenaCache, DefaultCache, QueryCache, QueryStorage, VecArenaCache, VecCache,
|
||||
CacheSelector, DefaultCacheSelector, QueryCache, QueryStorage, VecCacheSelector,
|
||||
};
|
||||
|
||||
mod config;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue