dashmap/mapref/
multiple.rs

1use crate::lock::{RwLockReadGuard, RwLockWriteGuard};
2use crate::HashMap;
3use core::hash::Hash;
4use core::ops::{Deref, DerefMut};
5use std::sync::Arc;
6
7pub struct RefMulti<'a, K, V> {
8    _guard: Arc<RwLockReadGuard<'a, HashMap<K, V>>>,
9    k: *const K,
10    v: *const V,
11}
12
13unsafe impl<'a, K: Eq + Hash + Sync, V: Sync> Send for RefMulti<'a, K, V> {}
14unsafe impl<'a, K: Eq + Hash + Sync, V: Sync> Sync for RefMulti<'a, K, V> {}
15
16impl<'a, K: Eq + Hash, V> RefMulti<'a, K, V> {
17    pub(crate) unsafe fn new(
18        guard: Arc<RwLockReadGuard<'a, HashMap<K, V>>>,
19        k: *const K,
20        v: *const V,
21    ) -> Self {
22        Self {
23            _guard: guard,
24            k,
25            v,
26        }
27    }
28
29    pub fn key(&self) -> &K {
30        self.pair().0
31    }
32
33    pub fn value(&self) -> &V {
34        self.pair().1
35    }
36
37    pub fn pair(&self) -> (&K, &V) {
38        unsafe { (&*self.k, &*self.v) }
39    }
40}
41
42impl<'a, K: Eq + Hash, V> Deref for RefMulti<'a, K, V> {
43    type Target = V;
44
45    fn deref(&self) -> &V {
46        self.value()
47    }
48}
49
50pub struct RefMutMulti<'a, K, V> {
51    _guard: Arc<RwLockWriteGuard<'a, HashMap<K, V>>>,
52    k: *const K,
53    v: *mut V,
54}
55
56unsafe impl<'a, K: Eq + Hash + Sync, V: Sync> Send for RefMutMulti<'a, K, V> {}
57unsafe impl<'a, K: Eq + Hash + Sync, V: Sync> Sync for RefMutMulti<'a, K, V> {}
58
59impl<'a, K: Eq + Hash, V> RefMutMulti<'a, K, V> {
60    pub(crate) unsafe fn new(
61        guard: Arc<RwLockWriteGuard<'a, HashMap<K, V>>>,
62        k: *const K,
63        v: *mut V,
64    ) -> Self {
65        Self {
66            _guard: guard,
67            k,
68            v,
69        }
70    }
71
72    pub fn key(&self) -> &K {
73        self.pair().0
74    }
75
76    pub fn value(&self) -> &V {
77        self.pair().1
78    }
79
80    pub fn value_mut(&mut self) -> &mut V {
81        self.pair_mut().1
82    }
83
84    pub fn pair(&self) -> (&K, &V) {
85        unsafe { (&*self.k, &*self.v) }
86    }
87
88    pub fn pair_mut(&mut self) -> (&K, &mut V) {
89        unsafe { (&*self.k, &mut *self.v) }
90    }
91}
92
93impl<'a, K: Eq + Hash, V> Deref for RefMutMulti<'a, K, V> {
94    type Target = V;
95
96    fn deref(&self) -> &V {
97        self.value()
98    }
99}
100
101impl<'a, K: Eq + Hash, V> DerefMut for RefMutMulti<'a, K, V> {
102    fn deref_mut(&mut self) -> &mut V {
103        self.value_mut()
104    }
105}