1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
use std::any::Any; use std::collections::HashMap; use std::hash::Hash; pub trait Cache<K> { fn save<T>(&mut self, key: K, value: T) where T: Any + 'static; fn get<T>(&self, key: &K) -> Option<&T> where T: Any + 'static; fn remove<T>(&mut self, key: &K) -> Option<T> where T: Any + 'static; fn clear(&mut self); } pub struct HashCache<K> { items: HashMap<K, Box<Any>> } impl<K> HashCache<K> where K: Eq + Hash { pub fn new() -> Self { HashCache { items: HashMap::new() } } } impl<K> Default for HashCache<K> where K: Eq + Hash { fn default() -> Self { Self::new() } } impl<K> Cache<K> for HashCache<K> where K: Eq + Hash { fn save<T>(&mut self, key: K, value: T) where T: Any + 'static { self.items.insert(key, Box::new(value)); } fn get<T>(&self, key: &K) -> Option<&T> where T: Any + 'static { self.items.get(key).and_then(|a| { a.downcast_ref::<T>() }) } fn remove<T>(&mut self, key: &K) -> Option<T> where T: Any + 'static { self.items.remove(key).and_then(|anybox| anybox.downcast().ok()).map(|b| *b) } fn clear(&mut self) { self.items.clear(); } } pub struct DummyCache; impl DummyCache { pub fn new() -> Self { DummyCache } } impl Default for DummyCache { fn default() -> Self { DummyCache } } impl<K> Cache<K> for DummyCache { fn save<T>(&mut self, _: K, _: T) where T: Any + 'static { } fn get<T>(&self, _: &K) -> Option<&T> where T: Any + 'static { None } fn remove<T>(&mut self, _: &K) -> Option<T> where T: Any + 'static { None } fn clear(&mut self) { } }