@@ -171,13 +171,27 @@ impl<'self> BufReader<'self> {
171171}
172172
173173impl < ' 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+ }
175189
176- fn eof ( & mut self ) -> bool { fail ! ( ) }
190+ fn eof ( & mut self ) -> bool { self . pos == self . buf . len ( ) }
177191}
178192
179193impl < ' self > Seek for BufReader < ' self > {
180- fn tell ( & self ) -> u64 { fail ! ( ) }
194+ fn tell ( & self ) -> u64 { self . pos as u64 }
181195
182196 fn seek ( & mut self , _pos : i64 , _style : SeekStyle ) { fail ! ( ) }
183197}
@@ -219,4 +233,26 @@ mod test {
219233 assert_eq ! ( reader. read( buf) , None ) ;
220234 assert ! ( reader. eof( ) ) ;
221235 }
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+ }
222258}
0 commit comments