@@ -102,35 +102,47 @@ pub struct TestIO {
102
102
}
103
103
104
104
#[ derive( Default ) ]
105
- pub struct CloseableCursor {
106
- data : RwLock < Vec < u8 > > ,
107
- cursor : RwLock < usize > ,
108
- waker : RwLock < Option < Waker > > ,
109
- closed : RwLock < bool > ,
105
+ struct CloseableCursorInner {
106
+ data : Vec < u8 > ,
107
+ cursor : usize ,
108
+ waker : Option < Waker > ,
109
+ closed : bool ,
110
110
}
111
111
112
+ #[ derive( Default ) ]
113
+ pub struct CloseableCursor ( RwLock < CloseableCursorInner > ) ;
114
+
112
115
impl CloseableCursor {
113
- fn len ( & self ) -> usize {
114
- self . data . read ( ) . unwrap ( ) . len ( )
116
+ pub fn len ( & self ) -> usize {
117
+ self . 0 . read ( ) . unwrap ( ) . data . len ( )
118
+ }
119
+
120
+ pub fn cursor ( & self ) -> usize {
121
+ self . 0 . read ( ) . unwrap ( ) . cursor
115
122
}
116
123
117
- fn cursor ( & self ) -> usize {
118
- * self . cursor . read ( ) . unwrap ( )
124
+ pub fn is_empty ( & self ) -> bool {
125
+ self . len ( ) == 0
119
126
}
120
127
121
- fn current ( & self ) -> bool {
122
- self . len ( ) == self . cursor ( )
128
+ pub fn current ( & self ) -> bool {
129
+ let inner = self . 0 . read ( ) . unwrap ( ) ;
130
+ inner. data . len ( ) == inner. cursor
123
131
}
124
132
125
- fn close ( & self ) {
126
- * self . closed . write ( ) . unwrap ( ) = true ;
133
+ pub fn close ( & self ) {
134
+ let mut inner = self . 0 . write ( ) . unwrap ( ) ;
135
+ inner. closed = true ;
136
+ if let Some ( waker) = inner. waker . take ( ) {
137
+ waker. wake ( ) ;
138
+ }
127
139
}
128
140
}
129
141
130
142
impl Display for CloseableCursor {
131
143
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
132
- let data = & * self . data . read ( ) . unwrap ( ) ;
133
- let s = std:: str:: from_utf8 ( data) . unwrap_or ( "not utf8" ) ;
144
+ let inner = self . 0 . read ( ) . unwrap ( ) ;
145
+ let s = std:: str:: from_utf8 ( & inner . data ) . unwrap_or ( "not utf8" ) ;
134
146
write ! ( f, "{}" , s)
135
147
}
136
148
}
@@ -163,13 +175,14 @@ impl TestIO {
163
175
164
176
impl Debug for CloseableCursor {
165
177
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
178
+ let inner = self . 0 . read ( ) . unwrap ( ) ;
166
179
f. debug_struct ( "CloseableCursor" )
167
180
. field (
168
181
"data" ,
169
- & std:: str:: from_utf8 ( & self . data . read ( ) . unwrap ( ) ) . unwrap_or ( "not utf8" ) ,
182
+ & std:: str:: from_utf8 ( & inner . data ) . unwrap_or ( "not utf8" ) ,
170
183
)
171
- . field ( "closed" , & * self . closed . read ( ) . unwrap ( ) )
172
- . field ( "cursor" , & * self . cursor . read ( ) . unwrap ( ) )
184
+ . field ( "closed" , & inner . closed )
185
+ . field ( "cursor" , & inner . cursor )
173
186
. finish ( )
174
187
}
175
188
}
@@ -180,18 +193,17 @@ impl Read for &CloseableCursor {
180
193
cx : & mut Context < ' _ > ,
181
194
buf : & mut [ u8 ] ,
182
195
) -> Poll < io:: Result < usize > > {
183
- let len = self . len ( ) ;
184
- let cursor = self . cursor ( ) ;
185
- if cursor < len {
186
- let data = & * self . data . read ( ) . unwrap ( ) ;
187
- let bytes_to_copy = buf. len ( ) . min ( len - cursor) ;
188
- buf[ ..bytes_to_copy] . copy_from_slice ( & data[ cursor..cursor + bytes_to_copy] ) ;
189
- * self . cursor . write ( ) . unwrap ( ) += bytes_to_copy;
196
+ let mut inner = self . 0 . write ( ) . unwrap ( ) ;
197
+ if inner. cursor < inner. data . len ( ) {
198
+ let bytes_to_copy = buf. len ( ) . min ( inner. data . len ( ) - inner. cursor ) ;
199
+ buf[ ..bytes_to_copy]
200
+ . copy_from_slice ( & inner. data [ inner. cursor ..inner. cursor + bytes_to_copy] ) ;
201
+ inner. cursor += bytes_to_copy;
190
202
Poll :: Ready ( Ok ( bytes_to_copy) )
191
- } else if * self . closed . read ( ) . unwrap ( ) {
203
+ } else if inner . closed {
192
204
Poll :: Ready ( Ok ( 0 ) )
193
205
} else {
194
- * self . waker . write ( ) . unwrap ( ) = Some ( cx. waker ( ) . clone ( ) ) ;
206
+ inner . waker = Some ( cx. waker ( ) . clone ( ) ) ;
195
207
Poll :: Pending
196
208
}
197
209
}
@@ -203,11 +215,12 @@ impl Write for &CloseableCursor {
203
215
_cx : & mut Context < ' _ > ,
204
216
buf : & [ u8 ] ,
205
217
) -> Poll < io:: Result < usize > > {
206
- if * self . closed . read ( ) . unwrap ( ) {
218
+ let mut inner = self . 0 . write ( ) . unwrap ( ) ;
219
+ if inner. closed {
207
220
Poll :: Ready ( Ok ( 0 ) )
208
221
} else {
209
- self . data . write ( ) . unwrap ( ) . extend_from_slice ( buf) ;
210
- if let Some ( waker) = self . waker . write ( ) . unwrap ( ) . take ( ) {
222
+ inner . data . extend_from_slice ( buf) ;
223
+ if let Some ( waker) = inner . waker . take ( ) {
211
224
waker. wake ( ) ;
212
225
}
213
226
Poll :: Ready ( Ok ( buf. len ( ) ) )
@@ -219,10 +232,7 @@ impl Write for &CloseableCursor {
219
232
}
220
233
221
234
fn poll_close ( self : Pin < & mut Self > , _cx : & mut Context < ' _ > ) -> Poll < io:: Result < ( ) > > {
222
- if let Some ( waker) = self . waker . write ( ) . unwrap ( ) . take ( ) {
223
- waker. wake ( ) ;
224
- }
225
- * self . closed . write ( ) . unwrap ( ) = true ;
235
+ self . close ( ) ;
226
236
Poll :: Ready ( Ok ( ( ) ) )
227
237
}
228
238
}
0 commit comments