dashmap/mapref/
one.rs

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