1use core::{
2 ops::{Deref, DerefMut, Try},
3 pin::Pin,
4};
5use crate::sync_tasks::TrSyncTask;
6
7pub trait TrSyncRwLock {
8 type Target: ?Sized;
9
10 fn acquire(&self) -> impl TrAcquire<'_, Self::Target>;
11}
12
13pub trait TrAcquire<'a, T>
14where
15 Self: 'a,
16 T: 'a + ?Sized,
17{
18 type ReaderGuard<'g>: TrReaderGuard<'a, 'g, T> where 'a: 'g;
19
20 type WriterGuard<'g>: TrWriterGuard<'a, 'g, T> where 'a: 'g;
21
22 type UpgradableGuard<'g>: TrUpgradableReaderGuard<'a, 'g, T> where 'a: 'g;
23
24 fn try_read<'g>(
25 self: Pin<&'g mut Self>,
26 ) -> impl Try<Output = Self::ReaderGuard<'g>>
27 where
28 'a: 'g;
29
30 fn try_write<'g>(
31 self: Pin<&'g mut Self>,
32 ) -> impl Try<Output = Self::WriterGuard<'g>>
33 where
34 'a: 'g;
35
36 fn try_upgradable_read<'g>(
37 self: Pin<&'g mut Self>,
38 ) -> impl Try<Output = Self::UpgradableGuard<'g>>
39 where
40 'a: 'g;
41
42 fn read<'g>(
43 self: Pin<&'g mut Self>,
44 ) -> impl TrSyncTask<MayCancelOutput = Self::ReaderGuard<'g>>
45 where
46 'a: 'g;
47
48 fn write<'g>(
49 self: Pin<&'g mut Self>,
50 ) -> impl TrSyncTask<MayCancelOutput = Self::WriterGuard<'g>>
51 where
52 'a: 'g;
53
54 fn upgradable_read<'g>(
55 self: Pin<&'g mut Self>,
56 ) -> impl TrSyncTask<MayCancelOutput = Self::UpgradableGuard<'g>>
57 where
58 'a: 'g;
59}
60
61pub trait TrReaderGuard<'a, 'g, T>
62where
63 'a: 'g,
64 Self: 'g + Sized + Deref<Target = T>,
65 T: 'a + ?Sized,
66{
67 type Acquire: TrAcquire<'a, T>;
68
69 fn as_reader_guard(&self) -> &Self {
70 self
71 }
72}
73
74pub trait TrUpgradableReaderGuard<'a, 'g, T>
75where
76 'a: 'g,
77 Self: 'g + TrReaderGuard<'a, 'g, T>,
78 T: 'a + ?Sized,
79{
80 fn downgrade(
81 self,
82 ) -> <Self::Acquire as TrAcquire<'a, T>>::ReaderGuard<'g>;
83
84 fn try_upgrade(
85 self,
86 ) -> Result<<Self::Acquire as TrAcquire<'a, T>>::WriterGuard<'g> , Self>;
87
88 fn upgrade(
89 self,
90 ) -> impl TrUpgrade<'a, 'g, T, Acquire = Self::Acquire>;
91}
92
93pub trait TrWriterGuard<'a, 'g, T>
94where
95 'a: 'g,
96 Self: 'g + TrReaderGuard<'a, 'g, T> + DerefMut<Target = T>,
97 T: 'a + ?Sized,
98{
99 fn downgrade_to_reader(
100 self,
101 ) -> <Self::Acquire as TrAcquire<'a, T>>::ReaderGuard<'g>;
102
103 fn downgrade_to_upgradable(
104 self,
105 ) -> <Self::Acquire as TrAcquire<'a, T>>::UpgradableGuard<'g>;
106}
107
108pub trait TrUpgrade<'a, 'g, T>
109where
110 'a: 'g,
111 T: 'a + ?Sized,
112{
113 type Acquire: TrAcquire<'a, T>;
114
115 fn try_upgrade<'u>(
116 self: Pin<&'u mut Self>,
117 ) -> impl Try<Output =
118 <Self::Acquire as TrAcquire<'a, T>>::WriterGuard<'u>>
119 where
120 'g: 'u;
121
122 fn upgrade<'u>(
123 self: Pin<&'u mut Self>,
124 ) -> impl TrSyncTask<MayCancelOutput =
125 <Self::Acquire as TrAcquire<'a, T>>::WriterGuard<'u>>
126 where
127 'g: 'u;
128
129 fn into_guard(
130 self,
131 ) -> <Self::Acquire as TrAcquire<'a, T>>::UpgradableGuard<'g>;
132}