@@ -171,13 +171,27 @@ impl<'self> BufReader<'self> {
171
171
}
172
172
173
173
impl < ' self > Reader for BufReader < ' self > {
174
- fn read ( & mut self , _buf : & mut [ u8 ] ) -> Option < uint > { fail ! ( ) }
174
+ fn read ( & mut self , buf : & mut [ u8 ] ) -> Option < uint > {
175
+ { if self . eof ( ) { return None ; } }
176
+
177
+ let write_len = min ( buf. len ( ) , self . buf . len ( ) - self . pos ) ;
178
+ {
179
+ let input = self . buf . slice ( self . pos , self . pos + write_len) ;
180
+ let output = buf. mut_slice ( 0 , write_len) ;
181
+ assert_eq ! ( input. len( ) , output. len( ) ) ;
182
+ vec:: bytes:: copy_memory ( output, input, write_len) ;
183
+ }
184
+ self . pos += write_len;
185
+ assert ! ( self . pos <= self . buf. len( ) ) ;
186
+
187
+ return Some ( write_len) ;
188
+ }
175
189
176
- fn eof ( & mut self ) -> bool { fail ! ( ) }
190
+ fn eof ( & mut self ) -> bool { self . pos == self . buf . len ( ) }
177
191
}
178
192
179
193
impl < ' self > Seek for BufReader < ' self > {
180
- fn tell ( & self ) -> u64 { fail ! ( ) }
194
+ fn tell ( & self ) -> u64 { self . pos as u64 }
181
195
182
196
fn seek ( & mut self , _pos : i64 , _style : SeekStyle ) { fail ! ( ) }
183
197
}
@@ -219,4 +233,26 @@ mod test {
219
233
assert_eq ! ( reader. read( buf) , None ) ;
220
234
assert ! ( reader. eof( ) ) ;
221
235
}
236
+
237
+ #[ test]
238
+ fn test_buf_reader ( ) {
239
+ let in_buf = ~[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
240
+ let mut reader = BufReader :: new ( in_buf) ;
241
+ let mut buf = [ ] ;
242
+ assert_eq ! ( reader. read( buf) , Some ( 0 ) ) ;
243
+ assert_eq ! ( reader. tell( ) , 0 ) ;
244
+ let mut buf = [ 0 ] ;
245
+ assert_eq ! ( reader. read( buf) , Some ( 1 ) ) ;
246
+ assert_eq ! ( reader. tell( ) , 1 ) ;
247
+ assert_eq ! ( buf, [ 0 ] ) ;
248
+ let mut buf = [ 0 , ..4 ] ;
249
+ assert_eq ! ( reader. read( buf) , Some ( 4 ) ) ;
250
+ assert_eq ! ( reader. tell( ) , 5 ) ;
251
+ assert_eq ! ( buf, [ 1 , 2 , 3 , 4 ] ) ;
252
+ assert_eq ! ( reader. read( buf) , Some ( 3 ) ) ;
253
+ assert_eq ! ( buf. slice( 0 , 3 ) , [ 5 , 6 , 7 ] ) ;
254
+ assert ! ( reader. eof( ) ) ;
255
+ assert_eq ! ( reader. read( buf) , None ) ;
256
+ assert ! ( reader. eof( ) ) ;
257
+ }
222
258
}
0 commit comments