1 use crate::lock
::{RwLockReadGuard, RwLockWriteGuard}
;
3 use core
::hash
::{BuildHasher, Hash}
;
4 use core
::ops
::{Deref, DerefMut}
;
5 use std
::collections
::hash_map
::RandomState
;
6 use std
::fmt
::{Debug, Formatter}
;
8 pub struct Ref
<'a
, K
, V
, S
= RandomState
> {
9 _guard
: RwLockReadGuard
<'a
, HashMap
<K
, V
, S
>>,
14 unsafe impl<'a
, K
: Eq
+ Hash
+ Sync
, V
: Sync
, S
: BuildHasher
> Send
for Ref
<'a
, K
, V
, S
> {}
15 unsafe impl<'a
, K
: Eq
+ Hash
+ Sync
, V
: Sync
, S
: BuildHasher
> Sync
for Ref
<'a
, K
, V
, S
> {}
17 impl<'a
, K
: Eq
+ Hash
, V
, S
: BuildHasher
> Ref
<'a
, K
, V
, S
> {
18 pub(crate) unsafe fn new(
19 guard
: RwLockReadGuard
<'a
, HashMap
<K
, V
, S
>>,
30 pub fn key(&self) -> &K
{
34 pub fn value(&self) -> &V
{
38 pub fn pair(&self) -> (&K
, &V
) {
39 unsafe { (&*self.k, &*self.v) }
42 pub fn map
<F
, T
>(self, f
: F
) -> MappedRef
<'a
, K
, V
, T
, S
>
49 v
: f(unsafe { &*self.v }
),
53 pub fn try_map
<F
, T
>(self, f
: F
) -> Result
<MappedRef
<'a
, K
, V
, T
, S
>, Self>
55 F
: FnOnce(&V
) -> Option
<&T
>,
57 if let Some(v
) = f(unsafe { &*self.v }
) {
69 impl<'a
, K
: Eq
+ Hash
+ Debug
, V
: Debug
, S
: BuildHasher
> Debug
for Ref
<'a
, K
, V
, S
> {
70 fn fmt(&self, f
: &mut Formatter
<'_
>) -> std
::fmt
::Result
{
78 impl<'a
, K
: Eq
+ Hash
, V
, S
: BuildHasher
> Deref
for Ref
<'a
, K
, V
, S
> {
81 fn deref(&self) -> &V
{
86 pub struct RefMut
<'a
, K
, V
, S
= RandomState
> {
87 guard
: RwLockWriteGuard
<'a
, HashMap
<K
, V
, S
>>,
92 unsafe impl<'a
, K
: Eq
+ Hash
+ Sync
, V
: Sync
, S
: BuildHasher
> Send
for RefMut
<'a
, K
, V
, S
> {}
93 unsafe impl<'a
, K
: Eq
+ Hash
+ Sync
, V
: Sync
, S
: BuildHasher
> Sync
for RefMut
<'a
, K
, V
, S
> {}
95 impl<'a
, K
: Eq
+ Hash
, V
, S
: BuildHasher
> RefMut
<'a
, K
, V
, S
> {
96 pub(crate) unsafe fn new(
97 guard
: RwLockWriteGuard
<'a
, HashMap
<K
, V
, S
>>,
104 pub fn key(&self) -> &K
{
108 pub fn value(&self) -> &V
{
112 pub fn value_mut(&mut self) -> &mut V
{
116 pub fn pair(&self) -> (&K
, &V
) {
117 unsafe { (&*self.k, &*self.v) }
120 pub fn pair_mut(&mut self) -> (&K
, &mut V
) {
121 unsafe { (&*self.k, &mut *self.v) }
124 pub fn downgrade(self) -> Ref
<'a
, K
, V
, S
> {
125 unsafe { Ref::new(RwLockWriteGuard::downgrade(self.guard), self.k, self.v) }
128 pub fn map
<F
, T
>(self, f
: F
) -> MappedRefMut
<'a
, K
, V
, T
, S
>
130 F
: FnOnce(&mut V
) -> &mut T
,
135 v
: f(unsafe { &mut *self.v }
),
139 pub fn try_map
<F
, T
>(self, f
: F
) -> Result
<MappedRefMut
<'a
, K
, V
, T
, S
>, Self>
141 F
: FnOnce(&mut V
) -> Option
<&mut T
>,
143 let v
= match f(unsafe { &mut *(self.v as *mut _) }
) {
145 None
=> return Err(self),
147 let guard
= self.guard
;
157 impl<'a
, K
: Eq
+ Hash
+ Debug
, V
: Debug
, S
: BuildHasher
> Debug
for RefMut
<'a
, K
, V
, S
> {
158 fn fmt(&self, f
: &mut Formatter
<'_
>) -> std
::fmt
::Result
{
159 f
.debug_struct("RefMut")
166 impl<'a
, K
: Eq
+ Hash
, V
, S
: BuildHasher
> Deref
for RefMut
<'a
, K
, V
, S
> {
169 fn deref(&self) -> &V
{
174 impl<'a
, K
: Eq
+ Hash
, V
, S
: BuildHasher
> DerefMut
for RefMut
<'a
, K
, V
, S
> {
175 fn deref_mut(&mut self) -> &mut V
{
180 pub struct MappedRef
<'a
, K
, V
, T
, S
= RandomState
> {
181 _guard
: RwLockReadGuard
<'a
, HashMap
<K
, V
, S
>>,
186 impl<'a
, K
: Eq
+ Hash
, V
, T
, S
: BuildHasher
> MappedRef
<'a
, K
, V
, T
, S
> {
187 pub fn key(&self) -> &K
{
191 pub fn value(&self) -> &T
{
195 pub fn pair(&self) -> (&K
, &T
) {
196 unsafe { (&*self.k, &*self.v) }
199 pub fn map
<F
, T2
>(self, f
: F
) -> MappedRef
<'a
, K
, V
, T2
, S
>
201 F
: FnOnce(&T
) -> &T2
,
206 v
: f(unsafe { &*self.v }
),
210 pub fn try_map
<F
, T2
>(self, f
: F
) -> Result
<MappedRef
<'a
, K
, V
, T2
, S
>, Self>
212 F
: FnOnce(&T
) -> Option
<&T2
>,
214 let v
= match f(unsafe { &*self.v }
) {
216 None
=> return Err(self),
218 let guard
= self._guard
;
227 impl<'a
, K
: Eq
+ Hash
+ Debug
, V
, T
: Debug
, S
: BuildHasher
> Debug
for MappedRef
<'a
, K
, V
, T
, S
> {
228 fn fmt(&self, f
: &mut Formatter
<'_
>) -> std
::fmt
::Result
{
229 f
.debug_struct("MappedRef")
236 impl<'a
, K
: Eq
+ Hash
, V
, T
, S
: BuildHasher
> Deref
for MappedRef
<'a
, K
, V
, T
, S
> {
239 fn deref(&self) -> &T
{
244 pub struct MappedRefMut
<'a
, K
, V
, T
, S
= RandomState
> {
245 _guard
: RwLockWriteGuard
<'a
, HashMap
<K
, V
, S
>>,
250 impl<'a
, K
: Eq
+ Hash
, V
, T
, S
: BuildHasher
> MappedRefMut
<'a
, K
, V
, T
, S
> {
251 pub fn key(&self) -> &K
{
255 pub fn value(&self) -> &T
{
259 pub fn value_mut(&mut self) -> &mut T
{
263 pub fn pair(&self) -> (&K
, &T
) {
264 unsafe { (&*self.k, &*self.v) }
267 pub fn pair_mut(&mut self) -> (&K
, &mut T
) {
268 unsafe { (&*self.k, &mut *self.v) }
271 pub fn map
<F
, T2
>(self, f
: F
) -> MappedRefMut
<'a
, K
, V
, T2
, S
>
273 F
: FnOnce(&mut T
) -> &mut T2
,
278 v
: f(unsafe { &mut *self.v }
),
282 pub fn try_map
<F
, T2
>(self, f
: F
) -> Result
<MappedRefMut
<'a
, K
, V
, T2
, S
>, Self>
284 F
: FnOnce(&mut T
) -> Option
<&mut T2
>,
286 let v
= match f(unsafe { &mut *(self.v as *mut _) }
) {
288 None
=> return Err(self),
290 let guard
= self._guard
;
300 impl<'a
, K
: Eq
+ Hash
+ Debug
, V
, T
: Debug
, S
: BuildHasher
> Debug
for MappedRefMut
<'a
, K
, V
, T
, S
> {
301 fn fmt(&self, f
: &mut Formatter
<'_
>) -> std
::fmt
::Result
{
302 f
.debug_struct("MappedRefMut")
309 impl<'a
, K
: Eq
+ Hash
, V
, T
, S
: BuildHasher
> Deref
for MappedRefMut
<'a
, K
, V
, T
, S
> {
312 fn deref(&self) -> &T
{
317 impl<'a
, K
: Eq
+ Hash
, V
, T
, S
: BuildHasher
> DerefMut
for MappedRefMut
<'a
, K
, V
, T
, S
> {
318 fn deref_mut(&mut self) -> &mut T
{