Guest User

Untitled

a guest
Nov 18th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.80 KB | None | 0 0
  1. use std::collections::hash_map;
  2. use std::hash::Hash;
  3.  
  4. pub struct Cacher<T, K, V>
  5. where
  6. T: Fn(K) -> V,
  7. {
  8. calculation: T,
  9. values: hash_map::HashMap<K, V>,
  10. }
  11.  
  12. impl<T, K: Eq + Hash + Clone, V> Cacher<T, K, V>
  13. where
  14. T: Fn(K) -> V,
  15. {
  16. pub fn new(calculation: T) -> Cacher<T, K, V> {
  17. Cacher {
  18. calculation,
  19. values: hash_map::HashMap::new(),
  20. }
  21. }
  22.  
  23. pub fn value(&mut self, k: K) -> &V {
  24. if self.values.contains_key(&k) {
  25. return &self.values[&k];
  26. }
  27. self.values.insert(k.clone(), (self.calculation)(k.clone()));
  28. self.values.get(&k).unwrap()
  29. }
  30. }
  31.  
  32. fn main() {
  33. let mut cacher = Cacher::new(|x| x);
  34. let run1 = cacher.value(5) as *const i32;
  35. let run2 = cacher.value(7) as *const i32;
  36.  
  37. assert_ne!(run1, run2);
  38. }
Add Comment
Please, Sign In to add comment