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}