dashmap/mapref/
multiple.rs

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