1
- use crate :: cell :: {
2
- PyMappedMutexGuard , PyMappedRwLockReadGuard , PyMappedRwLockWriteGuard , PyMutexGuard ,
3
- PyRwLockReadGuard , PyRwLockWriteGuard ,
1
+ use crate :: lock :: {
2
+ MapImmutable , PyImmutableMappedMutexGuard , PyMappedMutexGuard , PyMappedRwLockReadGuard ,
3
+ PyMappedRwLockWriteGuard , PyMutexGuard , PyRwLockReadGuard , PyRwLockWriteGuard ,
4
4
} ;
5
5
use std:: ops:: { Deref , DerefMut } ;
6
6
@@ -13,11 +13,30 @@ pub trait BorrowValue<'a> {
13
13
pub enum BorrowedValue < ' a , T : ?Sized > {
14
14
Ref ( & ' a T ) ,
15
15
MuLock ( PyMutexGuard < ' a , T > ) ,
16
- MappedMuLock ( PyMappedMutexGuard < ' a , T > ) ,
16
+ MappedMuLock ( PyImmutableMappedMutexGuard < ' a , T > ) ,
17
17
ReadLock ( PyRwLockReadGuard < ' a , T > ) ,
18
18
MappedReadLock ( PyMappedRwLockReadGuard < ' a , T > ) ,
19
19
}
20
20
21
+ impl < ' a , T : ?Sized > BorrowedValue < ' a , T > {
22
+ pub fn map < U : ?Sized , F > ( s : Self , f : F ) -> BorrowedValue < ' a , U >
23
+ where
24
+ F : FnOnce ( & T ) -> & U ,
25
+ {
26
+ match s {
27
+ Self :: Ref ( r) => BorrowedValue :: Ref ( f ( r) ) ,
28
+ Self :: MuLock ( m) => BorrowedValue :: MappedMuLock ( PyMutexGuard :: map_immutable ( m, f) ) ,
29
+ Self :: MappedMuLock ( m) => {
30
+ BorrowedValue :: MappedMuLock ( PyImmutableMappedMutexGuard :: map ( m, f) )
31
+ }
32
+ Self :: ReadLock ( r) => BorrowedValue :: MappedReadLock ( PyRwLockReadGuard :: map ( r, f) ) ,
33
+ Self :: MappedReadLock ( m) => {
34
+ BorrowedValue :: MappedReadLock ( PyMappedRwLockReadGuard :: map ( m, f) )
35
+ }
36
+ }
37
+ }
38
+ }
39
+
21
40
impl < T : ?Sized > Deref for BorrowedValue < ' _ , T > {
22
41
type Target = T ;
23
42
fn deref ( & self ) -> & T {
@@ -40,6 +59,23 @@ pub enum BorrowedValueMut<'a, T: ?Sized> {
40
59
MappedWriteLock ( PyMappedRwLockWriteGuard < ' a , T > ) ,
41
60
}
42
61
62
+ impl < ' a , T : ?Sized > BorrowedValueMut < ' a , T > {
63
+ pub fn map < U : ?Sized , F > ( s : Self , f : F ) -> BorrowedValueMut < ' a , U >
64
+ where
65
+ F : FnOnce ( & mut T ) -> & mut U ,
66
+ {
67
+ match s {
68
+ Self :: RefMut ( r) => BorrowedValueMut :: RefMut ( f ( r) ) ,
69
+ Self :: MuLock ( m) => BorrowedValueMut :: MappedMuLock ( PyMutexGuard :: map ( m, f) ) ,
70
+ Self :: MappedMuLock ( m) => BorrowedValueMut :: MappedMuLock ( PyMappedMutexGuard :: map ( m, f) ) ,
71
+ Self :: WriteLock ( r) => BorrowedValueMut :: MappedWriteLock ( PyRwLockWriteGuard :: map ( r, f) ) ,
72
+ Self :: MappedWriteLock ( m) => {
73
+ BorrowedValueMut :: MappedWriteLock ( PyMappedRwLockWriteGuard :: map ( m, f) )
74
+ }
75
+ }
76
+ }
77
+ }
78
+
43
79
impl < T : ?Sized > Deref for BorrowedValueMut < ' _ , T > {
44
80
type Target = T ;
45
81
fn deref ( & self ) -> & T {
0 commit comments