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 ,
44} ;
55use std:: ops:: { Deref , DerefMut } ;
66
@@ -13,11 +13,30 @@ pub trait BorrowValue<'a> {
1313pub enum BorrowedValue < ' a , T : ?Sized > {
1414 Ref ( & ' a T ) ,
1515 MuLock ( PyMutexGuard < ' a , T > ) ,
16- MappedMuLock ( PyMappedMutexGuard < ' a , T > ) ,
16+ MappedMuLock ( PyImmutableMappedMutexGuard < ' a , T > ) ,
1717 ReadLock ( PyRwLockReadGuard < ' a , T > ) ,
1818 MappedReadLock ( PyMappedRwLockReadGuard < ' a , T > ) ,
1919}
2020
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+
2140impl < T : ?Sized > Deref for BorrowedValue < ' _ , T > {
2241 type Target = T ;
2342 fn deref ( & self ) -> & T {
@@ -40,6 +59,23 @@ pub enum BorrowedValueMut<'a, T: ?Sized> {
4059 MappedWriteLock ( PyMappedRwLockWriteGuard < ' a , T > ) ,
4160}
4261
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+
4379impl < T : ?Sized > Deref for BorrowedValueMut < ' _ , T > {
4480 type Target = T ;
4581 fn deref ( & self ) -> & T {
0 commit comments