@@ -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
@@ -362,6 +397,16 @@ mod test {
362397 use self :: test:: Bencher ;
363398 use str:: StrPrelude ;
364399
400+ #[ test]
401+ fn test_vec_writer ( ) {
402+ let mut writer = Vec :: new ( ) ;
403+ writer. write ( & [ 0 ] ) . unwrap ( ) ;
404+ writer. write ( & [ 1 , 2 , 3 ] ) . unwrap ( ) ;
405+ writer. write ( & [ 4 , 5 , 6 , 7 ] ) . unwrap ( ) ;
406+ let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
407+ assert_eq ! ( writer. as_slice( ) , b) ;
408+ }
409+
365410 #[ test]
366411 fn test_mem_writer ( ) {
367412 let mut writer = MemWriter :: new ( ) ;
@@ -385,6 +430,8 @@ mod test {
385430 assert_eq ! ( writer. tell( ) , Ok ( 8 ) ) ;
386431 writer. write ( & [ ] ) . unwrap ( ) ;
387432 assert_eq ! ( writer. tell( ) , Ok ( 8 ) ) ;
433+
434+ assert ! ( writer. write( & [ 1 ] ) . is_err( ) ) ;
388435 }
389436 let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
390437 assert_eq ! ( buf. as_slice( ) , b) ;
@@ -457,6 +504,32 @@ mod test {
457504 assert ! ( reader. read( & mut buf) . is_err( ) ) ;
458505 }
459506
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+
460533 #[ test]
461534 fn test_buf_reader ( ) {
462535 let in_buf = vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
0 commit comments