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}