1 use crate::lock::{RwLockReadGuard, RwLockWriteGuard}; 2 use crate::HashMap; 3 use core::hash::BuildHasher; 4 use core::hash::Hash; 5 use core::ops::{Deref, DerefMut}; 6 use std::collections::hash_map::RandomState; 7 use std::sync::Arc; 8 9 pub 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 15 unsafe impl<'a, K: Eq + Hash + Sync, V: Sync, S: BuildHasher> Send for RefMulti<'a, K, V, S> {} 16 unsafe impl<'a, K: Eq + Hash + Sync, V: Sync, S: BuildHasher> Sync for RefMulti<'a, K, V, S> {} 17 18 impl<'a, K: Eq + Hash, V, S: BuildHasher> RefMulti<'a, K, V, S> { new( guard: Arc<RwLockReadGuard<'a, HashMap<K, V, S>>>, k: *const K, v: *const V, ) -> Self19 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 key(&self) -> &K31 pub fn key(&self) -> &K { 32 self.pair().0 33 } 34 value(&self) -> &V35 pub fn value(&self) -> &V { 36 self.pair().1 37 } 38 pair(&self) -> (&K, &V)39 pub fn pair(&self) -> (&K, &V) { 40 unsafe { (&*self.k, &*self.v) } 41 } 42 } 43 44 impl<'a, K: Eq + Hash, V, S: BuildHasher> Deref for RefMulti<'a, K, V, S> { 45 type Target = V; 46 deref(&self) -> &V47 fn deref(&self) -> &V { 48 self.value() 49 } 50 } 51 52 pub 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 58 unsafe impl<'a, K: Eq + Hash + Sync, V: Sync, S: BuildHasher> Send for RefMutMulti<'a, K, V, S> {} 59 unsafe impl<'a, K: Eq + Hash + Sync, V: Sync, S: BuildHasher> Sync for RefMutMulti<'a, K, V, S> {} 60 61 impl<'a, K: Eq + Hash, V, S: BuildHasher> RefMutMulti<'a, K, V, S> { new( guard: Arc<RwLockWriteGuard<'a, HashMap<K, V, S>>>, k: *const K, v: *mut V, ) -> Self62 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 key(&self) -> &K74 pub fn key(&self) -> &K { 75 self.pair().0 76 } 77 value(&self) -> &V78 pub fn value(&self) -> &V { 79 self.pair().1 80 } 81 value_mut(&mut self) -> &mut V82 pub fn value_mut(&mut self) -> &mut V { 83 self.pair_mut().1 84 } 85 pair(&self) -> (&K, &V)86 pub fn pair(&self) -> (&K, &V) { 87 unsafe { (&*self.k, &*self.v) } 88 } 89 pair_mut(&mut self) -> (&K, &mut V)90 pub fn pair_mut(&mut self) -> (&K, &mut V) { 91 unsafe { (&*self.k, &mut *self.v) } 92 } 93 } 94 95 impl<'a, K: Eq + Hash, V, S: BuildHasher> Deref for RefMutMulti<'a, K, V, S> { 96 type Target = V; 97 deref(&self) -> &V98 fn deref(&self) -> &V { 99 self.value() 100 } 101 } 102 103 impl<'a, K: Eq + Hash, V, S: BuildHasher> DerefMut for RefMutMulti<'a, K, V, S> { deref_mut(&mut self) -> &mut V104 fn deref_mut(&mut self) -> &mut V { 105 self.value_mut() 106 } 107 } 108