dashmap/mapref/
multiple.rs1use 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}