@@ -229,6 +229,36 @@ pub fn copy<R: Reader, W: Writer>(r: &mut R, w: &mut W) -> io::IoResult<()> {
229
229
}
230
230
}
231
231
232
+ /// A `Reader` which converts an `Iterator<u8>` into a `Reader`.
233
+ pub struct IterReader < T > {
234
+ iter : T ,
235
+ }
236
+
237
+ impl < T : Iterator < u8 > > IterReader < T > {
238
+ /// Create a new `IterReader` which will read from the specified `Iterator`.
239
+ pub fn new ( iter : T ) -> IterReader < T > {
240
+ IterReader {
241
+ iter : iter,
242
+ }
243
+ }
244
+ }
245
+
246
+ impl < T : Iterator < u8 > > Reader for IterReader < T > {
247
+ #[ inline]
248
+ fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: IoResult < uint > {
249
+ let mut len = 0 ;
250
+ for ( slot, elt) in buf. mut_iter ( ) . zip ( self . iter . by_ref ( ) ) {
251
+ * slot = elt;
252
+ len += 1 ;
253
+ }
254
+ if len == 0 {
255
+ Err ( io:: standard_error ( io:: EndOfFile ) )
256
+ } else {
257
+ Ok ( len)
258
+ }
259
+ }
260
+ }
261
+
232
262
#[ cfg( test) ]
233
263
mod test {
234
264
use io:: { MemReader , MemWriter , BufReader } ;
@@ -366,4 +396,23 @@ mod test {
366
396
assert_eq ! ( r. read_line( ) , Ok ( "23456789\n " . to_str( ) ) ) ;
367
397
}
368
398
}
399
+
400
+ #[ test]
401
+ fn test_iter_reader ( ) {
402
+ let mut r = IterReader :: new ( range ( 0u8 , 8 ) ) ;
403
+ let mut buf = [ 0 , 0 , 0 ] ;
404
+ let len = r. read ( buf) . unwrap ( ) ;
405
+ assert_eq ! ( len, 3 ) ;
406
+ assert ! ( buf == [ 0 , 1 , 2 ] ) ;
407
+
408
+ let len = r. read ( buf) . unwrap ( ) ;
409
+ assert_eq ! ( len, 3 ) ;
410
+ assert ! ( buf == [ 3 , 4 , 5 ] ) ;
411
+
412
+ let len = r. read ( buf) . unwrap ( ) ;
413
+ assert_eq ! ( len, 2 ) ;
414
+ assert ! ( buf == [ 6 , 7 , 5 ] ) ;
415
+
416
+ assert_eq ! ( r. read( buf) . unwrap_err( ) . kind, io:: EndOfFile ) ;
417
+ }
369
418
}
0 commit comments