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}