@@ -206,6 +206,41 @@ impl Buffer for MemReader {
206
206
fn consume ( & mut self , amt : uint ) { self . pos += amt; }
207
207
}
208
208
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
+
209
244
/// Writes to a fixed-size byte slice
210
245
///
211
246
/// If a write will not fit in the buffer, it returns an error and does not
@@ -362,6 +397,16 @@ mod test {
362
397
use self :: test:: Bencher ;
363
398
use str:: StrPrelude ;
364
399
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
+
365
410
#[ test]
366
411
fn test_mem_writer ( ) {
367
412
let mut writer = MemWriter :: new ( ) ;
@@ -385,6 +430,8 @@ mod test {
385
430
assert_eq ! ( writer. tell( ) , Ok ( 8 ) ) ;
386
431
writer. write ( & [ ] ) . unwrap ( ) ;
387
432
assert_eq ! ( writer. tell( ) , Ok ( 8 ) ) ;
433
+
434
+ assert ! ( writer. write( & [ 1 ] ) . is_err( ) ) ;
388
435
}
389
436
let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
390
437
assert_eq ! ( buf. as_slice( ) , b) ;
@@ -457,6 +504,32 @@ mod test {
457
504
assert ! ( reader. read( & mut buf) . is_err( ) ) ;
458
505
}
459
506
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
+
460
533
#[ test]
461
534
fn test_buf_reader ( ) {
462
535
let in_buf = vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
0 commit comments