@@ -55,6 +55,24 @@ impl<R: Reader> Reader for LimitReader<R> {
55
55
}
56
56
}
57
57
58
+ impl < R : Buffer > Buffer for LimitReader < R > {
59
+ fn fill_buf < ' a > ( & ' a mut self ) -> io:: IoResult < & ' a [ u8 ] > {
60
+ let amt = try!( self . inner . fill_buf ( ) ) ;
61
+ let buf = amt. slice_to ( cmp:: min ( amt. len ( ) , self . limit ) ) ;
62
+ if buf. len ( ) == 0 {
63
+ Err ( io:: standard_error ( io:: EndOfFile ) )
64
+ } else {
65
+ Ok ( buf)
66
+ }
67
+ }
68
+
69
+ fn consume ( & mut self , amt : uint ) {
70
+ self . limit -= amt;
71
+ self . inner . consume ( amt) ;
72
+ }
73
+
74
+ }
75
+
58
76
/// A `Writer` which ignores bytes written to it, like /dev/null.
59
77
pub struct NullWriter ;
60
78
@@ -74,6 +92,14 @@ impl Reader for ZeroReader {
74
92
}
75
93
}
76
94
95
+ impl Buffer for ZeroReader {
96
+ fn fill_buf < ' a > ( & ' a mut self ) -> io:: IoResult < & ' a [ u8 ] > {
97
+ static DATA : [ u8 , ..64 ] = [ 0 , ..64 ] ;
98
+ Ok ( DATA . as_slice ( ) )
99
+ }
100
+ fn consume ( & mut self , _amt : uint ) { }
101
+ }
102
+
77
103
/// A `Reader` which is always at EOF, like /dev/null.
78
104
pub struct NullReader ;
79
105
@@ -84,6 +110,13 @@ impl Reader for NullReader {
84
110
}
85
111
}
86
112
113
+ impl Buffer for NullReader {
114
+ fn fill_buf < ' a > ( & ' a mut self ) -> io:: IoResult < & ' a [ u8 ] > {
115
+ Err ( io:: standard_error ( io:: EndOfFile ) )
116
+ }
117
+ fn consume ( & mut self , _amt : uint ) { }
118
+ }
119
+
87
120
/// A `Writer` which multiplexes writes to a set of `Writers`.
88
121
pub struct MultiWriter {
89
122
writers : Vec < Box < Writer > >
@@ -198,8 +231,8 @@ pub fn copy<R: Reader, W: Writer>(r: &mut R, w: &mut W) -> io::IoResult<()> {
198
231
199
232
#[ cfg( test) ]
200
233
mod test {
234
+ use io:: { MemReader , MemWriter , BufReader } ;
201
235
use io;
202
- use io:: { MemReader , MemWriter } ;
203
236
use owned:: Box ;
204
237
use super :: * ;
205
238
use prelude:: * ;
@@ -309,4 +342,28 @@ mod test {
309
342
copy ( & mut r, & mut w) . unwrap ( ) ;
310
343
assert_eq ! ( vec!( 0 , 1 , 2 , 3 , 4 ) , w. unwrap( ) ) ;
311
344
}
345
+
346
+ #[ test]
347
+ fn limit_reader_buffer ( ) {
348
+ let data = "0123456789\n 0123456789\n " ;
349
+ let mut r = BufReader :: new ( data. as_bytes ( ) ) ;
350
+ {
351
+ let mut r = LimitReader :: new ( r. by_ref ( ) , 3 ) ;
352
+ assert_eq ! ( r. read_line( ) , Ok ( "012" . to_str( ) ) ) ;
353
+ assert_eq ! ( r. limit( ) , 0 ) ;
354
+ assert_eq ! ( r. read_line( ) . err( ) . unwrap( ) . kind, io:: EndOfFile ) ;
355
+ }
356
+ {
357
+ let mut r = LimitReader :: new ( r. by_ref ( ) , 9 ) ;
358
+ assert_eq ! ( r. read_line( ) , Ok ( "3456789\n " . to_str( ) ) ) ;
359
+ assert_eq ! ( r. limit( ) , 1 ) ;
360
+ assert_eq ! ( r. read_line( ) , Ok ( "0" . to_str( ) ) ) ;
361
+ }
362
+ {
363
+ let mut r = LimitReader :: new ( r. by_ref ( ) , 100 ) ;
364
+ assert_eq ! ( r. read_char( ) , Ok ( '1' ) ) ;
365
+ assert_eq ! ( r. limit( ) , 99 ) ;
366
+ assert_eq ! ( r. read_line( ) , Ok ( "23456789\n " . to_str( ) ) ) ;
367
+ }
368
+ }
312
369
}
0 commit comments