dashmap/mapref/
multiple.rs

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