ref_map.rs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. use std::collections::HashMap;
  2. use std::sync::Arc;
  3. pub trait RefCountValue {
  4. fn did_remove(&self) {}
  5. }
  6. struct RefCountHandler<T> {
  7. ref_count: usize,
  8. inner: T,
  9. }
  10. impl<T> RefCountHandler<T> {
  11. pub fn new(inner: T) -> Self {
  12. Self { ref_count: 1, inner }
  13. }
  14. pub fn increase_ref_count(&mut self) {
  15. self.ref_count += 1;
  16. }
  17. }
  18. pub struct RefCountHashMap<T>(HashMap<String, RefCountHandler<T>>);
  19. impl<T> std::default::Default for RefCountHashMap<T> {
  20. fn default() -> Self {
  21. Self(HashMap::new())
  22. }
  23. }
  24. impl<T> RefCountHashMap<T>
  25. where
  26. T: Clone + Send + Sync + RefCountValue,
  27. {
  28. pub fn new() -> Self {
  29. Self::default()
  30. }
  31. pub fn get(&self, key: &str) -> Option<T> {
  32. self.0.get(key).map(|handler| handler.inner.clone())
  33. }
  34. pub fn values(&self) -> Vec<T> {
  35. self.0.values().map(|value| value.inner.clone()).collect::<Vec<T>>()
  36. }
  37. pub fn insert(&mut self, key: String, value: T) {
  38. if let Some(handler) = self.0.get_mut(&key) {
  39. handler.increase_ref_count();
  40. } else {
  41. let handler = RefCountHandler::new(value);
  42. self.0.insert(key, handler);
  43. }
  44. }
  45. pub fn remove(&mut self, key: &str) {
  46. let mut should_remove = false;
  47. if let Some(value) = self.0.get_mut(key) {
  48. if value.ref_count > 0 {
  49. value.ref_count -= 1;
  50. }
  51. should_remove = value.ref_count == 0;
  52. }
  53. if should_remove {
  54. if let Some(handler) = self.0.remove(key) {
  55. handler.inner.did_remove();
  56. }
  57. }
  58. }
  59. }
  60. impl<T> RefCountValue for Arc<T>
  61. where
  62. T: RefCountValue,
  63. {
  64. fn did_remove(&self) {
  65. (**self).did_remove()
  66. }
  67. }