@@ -206,6 +206,41 @@ impl Buffer for MemReader {
206206 fn consume ( & mut self , amt : uint ) { self . pos += amt; }
207207}
208208
209+ impl < ' a > Reader for & ' a [ u8 ] {
210+ #[ inline]
211+ fn read ( & mut self , buf : & mut [ u8 ] ) -> IoResult < uint > {
212+ if self . is_empty ( ) { return Err ( io:: standard_error ( io:: EndOfFile ) ) ; }
213+
214+ let write_len = min ( buf. len ( ) , self . len ( ) ) ;
215+ {
216+ let input = self [ ..write_len] ;
217+ let output = buf[ mut ..write_len] ;
218+ slice:: bytes:: copy_memory ( output, input) ;
219+ }
220+
221+ * self = self . slice_from ( write_len) ;
222+
223+ Ok ( write_len)
224+ }
225+ }
226+
227+ impl < ' a > Buffer for & ' a [ u8 ] {
228+ #[ inline]
229+ fn fill_buf < ' a > ( & ' a mut self ) -> IoResult < & ' a [ u8 ] > {
230+ if self . is_empty ( ) {
231+ Err ( io:: standard_error ( io:: EndOfFile ) )
232+ } else {
233+ Ok ( * self )
234+ }
235+ }
236+
237+ #[ inline]
238+ fn consume ( & mut self , amt : uint ) {
239+ * self = self [ amt..] ;
240+ }
241+ }
242+
243+
209244/// Writes to a fixed-size byte slice
210245///
211246/// If a write will not fit in the buffer, it returns an error and does not
@@ -469,6 +504,32 @@ mod test {
469504 assert ! ( reader. read( & mut buf) . is_err( ) ) ;
470505 }
471506
507+ #[ test]
508+ fn test_slice_reader ( ) {
509+ let in_buf = vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
510+ let mut reader = & mut in_buf. as_slice ( ) ;
511+ let mut buf = [ ] ;
512+ assert_eq ! ( reader. read( & mut buf) , Ok ( 0 ) ) ;
513+ let mut buf = [ 0 ] ;
514+ assert_eq ! ( reader. read( & mut buf) , Ok ( 1 ) ) ;
515+ assert_eq ! ( reader. len( ) , 7 ) ;
516+ let b: & [ _ ] = & [ 0 ] ;
517+ assert_eq ! ( buf. as_slice( ) , b) ;
518+ let mut buf = [ 0 , ..4 ] ;
519+ assert_eq ! ( reader. read( & mut buf) , Ok ( 4 ) ) ;
520+ assert_eq ! ( reader. len( ) , 3 ) ;
521+ let b: & [ _ ] = & [ 1 , 2 , 3 , 4 ] ;
522+ assert_eq ! ( buf. as_slice( ) , b) ;
523+ assert_eq ! ( reader. read( & mut buf) , Ok ( 3 ) ) ;
524+ let b: & [ _ ] = & [ 5 , 6 , 7 ] ;
525+ assert_eq ! ( buf[ 0 ..3 ] , b) ;
526+ assert ! ( reader. read( & mut buf) . is_err( ) ) ;
527+ let mut reader = & mut in_buf. as_slice ( ) ;
528+ assert_eq ! ( reader. read_until( 3 ) . unwrap( ) , vec!( 0 , 1 , 2 , 3 ) ) ;
529+ assert_eq ! ( reader. read_until( 3 ) . unwrap( ) , vec!( 4 , 5 , 6 , 7 ) ) ;
530+ assert ! ( reader. read( & mut buf) . is_err( ) ) ;
531+ }
532+
472533 #[ test]
473534 fn test_buf_reader ( ) {
474535 let in_buf = vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
0 commit comments