@@ -2,7 +2,7 @@ use io::prelude::*;
2
2
3
3
use core:: convert:: TryInto ;
4
4
use cmp;
5
- use io:: { self , Initializer , SeekFrom , Error , ErrorKind } ;
5
+ use io:: { self , Initializer , SeekFrom , Error , ErrorKind , IoVec , IoVecMut } ;
6
6
7
7
/// A `Cursor` wraps an in-memory buffer and provides it with a
8
8
/// [`Seek`] implementation.
@@ -221,6 +221,19 @@ impl<T> Read for Cursor<T> where T: AsRef<[u8]> {
221
221
Ok ( n)
222
222
}
223
223
224
+ fn read_vectored ( & mut self , bufs : & mut [ IoVecMut < ' _ > ] ) -> io:: Result < usize > {
225
+ let mut nread = 0 ;
226
+ for buf in bufs {
227
+ let buf = buf. as_mut_slice ( ) ;
228
+ let n = self . read ( buf) ?;
229
+ nread += n;
230
+ if n < buf. len ( ) {
231
+ break ;
232
+ }
233
+ }
234
+ Ok ( nread)
235
+ }
236
+
224
237
fn read_exact ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < ( ) > {
225
238
let n = buf. len ( ) ;
226
239
Read :: read_exact ( & mut self . fill_buf ( ) ?, buf) ?;
@@ -251,6 +264,24 @@ fn slice_write(pos_mut: &mut u64, slice: &mut [u8], buf: &[u8]) -> io::Result<us
251
264
Ok ( amt)
252
265
}
253
266
267
+ fn slice_write_vectored (
268
+ pos_mut : & mut u64 ,
269
+ slice : & mut [ u8 ] ,
270
+ bufs : & [ IoVec < ' _ > ] ,
271
+ ) -> io:: Result < usize >
272
+ {
273
+ let mut nwritten = 0 ;
274
+ for buf in bufs {
275
+ let buf = buf. as_slice ( ) ;
276
+ let n = slice_write ( pos_mut, slice, buf) ?;
277
+ nwritten += n;
278
+ if n < buf. len ( ) {
279
+ break ;
280
+ }
281
+ }
282
+ Ok ( nwritten)
283
+ }
284
+
254
285
// Resizing write implementation
255
286
fn vec_write ( pos_mut : & mut u64 , vec : & mut Vec < u8 > , buf : & [ u8 ] ) -> io:: Result < usize > {
256
287
let pos: usize = ( * pos_mut) . try_into ( ) . map_err ( |_| {
@@ -278,12 +309,31 @@ fn vec_write(pos_mut: &mut u64, vec: &mut Vec<u8>, buf: &[u8]) -> io::Result<usi
278
309
Ok ( buf. len ( ) )
279
310
}
280
311
312
+ fn vec_write_vectored (
313
+ pos_mut : & mut u64 ,
314
+ vec : & mut Vec < u8 > ,
315
+ bufs : & [ IoVec < ' _ > ] ,
316
+ ) -> io:: Result < usize >
317
+ {
318
+ let mut nwritten = 0 ;
319
+ for buf in bufs {
320
+ nwritten += vec_write ( pos_mut, vec, buf. as_slice ( ) ) ?;
321
+ }
322
+ Ok ( nwritten)
323
+ }
324
+
281
325
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
282
326
impl < ' a > Write for Cursor < & ' a mut [ u8 ] > {
283
327
#[ inline]
284
328
fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
285
329
slice_write ( & mut self . pos , self . inner , buf)
286
330
}
331
+
332
+ #[ inline]
333
+ fn write_vectored ( & mut self , bufs : & [ IoVec < ' _ > ] ) -> io:: Result < usize > {
334
+ slice_write_vectored ( & mut self . pos , self . inner , bufs)
335
+ }
336
+
287
337
fn flush ( & mut self ) -> io:: Result < ( ) > { Ok ( ( ) ) }
288
338
}
289
339
@@ -292,6 +342,11 @@ impl<'a> Write for Cursor<&'a mut Vec<u8>> {
292
342
fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
293
343
vec_write ( & mut self . pos , self . inner , buf)
294
344
}
345
+
346
+ fn write_vectored ( & mut self , bufs : & [ IoVec < ' _ > ] ) -> io:: Result < usize > {
347
+ vec_write_vectored ( & mut self . pos , self . inner , bufs)
348
+ }
349
+
295
350
fn flush ( & mut self ) -> io:: Result < ( ) > { Ok ( ( ) ) }
296
351
}
297
352
@@ -300,6 +355,11 @@ impl Write for Cursor<Vec<u8>> {
300
355
fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
301
356
vec_write ( & mut self . pos , & mut self . inner , buf)
302
357
}
358
+
359
+ fn write_vectored ( & mut self , bufs : & [ IoVec < ' _ > ] ) -> io:: Result < usize > {
360
+ vec_write_vectored ( & mut self . pos , & mut self . inner , bufs)
361
+ }
362
+
303
363
fn flush ( & mut self ) -> io:: Result < ( ) > { Ok ( ( ) ) }
304
364
}
305
365
@@ -309,21 +369,30 @@ impl Write for Cursor<Box<[u8]>> {
309
369
fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
310
370
slice_write ( & mut self . pos , & mut self . inner , buf)
311
371
}
372
+
373
+ #[ inline]
374
+ fn write_vectored ( & mut self , bufs : & [ IoVec < ' _ > ] ) -> io:: Result < usize > {
375
+ slice_write_vectored ( & mut self . pos , & mut self . inner , bufs)
376
+ }
377
+
312
378
fn flush ( & mut self ) -> io:: Result < ( ) > { Ok ( ( ) ) }
313
379
}
314
380
315
381
#[ cfg( test) ]
316
382
mod tests {
317
383
use io:: prelude:: * ;
318
- use io:: { Cursor , SeekFrom } ;
384
+ use io:: { Cursor , SeekFrom , IoVec , IoVecMut } ;
319
385
320
386
#[ test]
321
387
fn test_vec_writer ( ) {
322
388
let mut writer = Vec :: new ( ) ;
323
389
assert_eq ! ( writer. write( & [ 0 ] ) . unwrap( ) , 1 ) ;
324
390
assert_eq ! ( writer. write( & [ 1 , 2 , 3 ] ) . unwrap( ) , 3 ) ;
325
391
assert_eq ! ( writer. write( & [ 4 , 5 , 6 , 7 ] ) . unwrap( ) , 4 ) ;
326
- let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
392
+ assert_eq ! ( writer. write_vectored(
393
+ & [ IoVec :: new( & [ ] ) , IoVec :: new( & [ 8 , 9 ] ) , IoVec :: new( & [ 10 ] ) ] ,
394
+ ) . unwrap( ) , 3 ) ;
395
+ let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ;
327
396
assert_eq ! ( writer, b) ;
328
397
}
329
398
@@ -333,7 +402,10 @@ mod tests {
333
402
assert_eq ! ( writer. write( & [ 0 ] ) . unwrap( ) , 1 ) ;
334
403
assert_eq ! ( writer. write( & [ 1 , 2 , 3 ] ) . unwrap( ) , 3 ) ;
335
404
assert_eq ! ( writer. write( & [ 4 , 5 , 6 , 7 ] ) . unwrap( ) , 4 ) ;
336
- let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
405
+ assert_eq ! ( writer. write_vectored(
406
+ & [ IoVec :: new( & [ ] ) , IoVec :: new( & [ 8 , 9 ] ) , IoVec :: new( & [ 10 ] ) ] ,
407
+ ) . unwrap( ) , 3 ) ;
408
+ let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ;
337
409
assert_eq ! ( & writer. get_ref( ) [ ..] , b) ;
338
410
}
339
411
@@ -344,7 +416,10 @@ mod tests {
344
416
assert_eq ! ( writer. write( & [ 0 ] ) . unwrap( ) , 1 ) ;
345
417
assert_eq ! ( writer. write( & [ 1 , 2 , 3 ] ) . unwrap( ) , 3 ) ;
346
418
assert_eq ! ( writer. write( & [ 4 , 5 , 6 , 7 ] ) . unwrap( ) , 4 ) ;
347
- let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
419
+ assert_eq ! ( writer. write_vectored(
420
+ & [ IoVec :: new( & [ ] ) , IoVec :: new( & [ 8 , 9 ] ) , IoVec :: new( & [ 10 ] ) ] ,
421
+ ) . unwrap( ) , 3 ) ;
422
+ let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ;
348
423
assert_eq ! ( & writer. get_ref( ) [ ..] , b) ;
349
424
}
350
425
@@ -366,6 +441,26 @@ mod tests {
366
441
assert_eq ! ( & * * writer. get_ref( ) , b) ;
367
442
}
368
443
444
+ #[ test]
445
+ fn test_box_slice_writer_vectored ( ) {
446
+ let mut writer = Cursor :: new ( vec ! [ 0u8 ; 9 ] . into_boxed_slice ( ) ) ;
447
+ assert_eq ! ( writer. position( ) , 0 ) ;
448
+ assert_eq ! ( writer. write_vectored( & [ IoVec :: new( & [ 0 ] ) ] ) . unwrap( ) , 1 ) ;
449
+ assert_eq ! ( writer. position( ) , 1 ) ;
450
+ assert_eq ! (
451
+ writer. write_vectored( & [ IoVec :: new( & [ 1 , 2 , 3 ] ) , IoVec :: new( & [ 4 , 5 , 6 , 7 ] ) ] ) . unwrap( ) ,
452
+ 7 ,
453
+ ) ;
454
+ assert_eq ! ( writer. position( ) , 8 ) ;
455
+ assert_eq ! ( writer. write_vectored( & [ ] ) . unwrap( ) , 0 ) ;
456
+ assert_eq ! ( writer. position( ) , 8 ) ;
457
+
458
+ assert_eq ! ( writer. write_vectored( & [ IoVec :: new( & [ 8 , 9 ] ) ] ) . unwrap( ) , 1 ) ;
459
+ assert_eq ! ( writer. write_vectored( & [ IoVec :: new( & [ 10 ] ) ] ) . unwrap( ) , 0 ) ;
460
+ let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] ;
461
+ assert_eq ! ( & * * writer. get_ref( ) , b) ;
462
+ }
463
+
369
464
#[ test]
370
465
fn test_buf_writer ( ) {
371
466
let mut buf = [ 0 as u8 ; 9 ] ;
@@ -387,6 +482,31 @@ mod tests {
387
482
assert_eq ! ( buf, b) ;
388
483
}
389
484
485
+ #[ test]
486
+ fn test_buf_writer_vectored ( ) {
487
+ let mut buf = [ 0 as u8 ; 9 ] ;
488
+ {
489
+ let mut writer = Cursor :: new ( & mut buf[ ..] ) ;
490
+ assert_eq ! ( writer. position( ) , 0 ) ;
491
+ assert_eq ! ( writer. write_vectored( & [ IoVec :: new( & [ 0 ] ) ] ) . unwrap( ) , 1 ) ;
492
+ assert_eq ! ( writer. position( ) , 1 ) ;
493
+ assert_eq ! (
494
+ writer. write_vectored(
495
+ & [ IoVec :: new( & [ 1 , 2 , 3 ] ) , IoVec :: new( & [ 4 , 5 , 6 , 7 ] ) ] ,
496
+ ) . unwrap( ) ,
497
+ 7 ,
498
+ ) ;
499
+ assert_eq ! ( writer. position( ) , 8 ) ;
500
+ assert_eq ! ( writer. write_vectored( & [ ] ) . unwrap( ) , 0 ) ;
501
+ assert_eq ! ( writer. position( ) , 8 ) ;
502
+
503
+ assert_eq ! ( writer. write_vectored( & [ IoVec :: new( & [ 8 , 9 ] ) ] ) . unwrap( ) , 1 ) ;
504
+ assert_eq ! ( writer. write_vectored( & [ IoVec :: new( & [ 10 ] ) ] ) . unwrap( ) , 0 ) ;
505
+ }
506
+ let b: & [ _ ] = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] ;
507
+ assert_eq ! ( buf, b) ;
508
+ }
509
+
390
510
#[ test]
391
511
fn test_buf_writer_seek ( ) {
392
512
let mut buf = [ 0 as u8 ; 8 ] ;
@@ -447,6 +567,35 @@ mod tests {
447
567
assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 0 ) ;
448
568
}
449
569
570
+ #[ test]
571
+ fn test_mem_reader_vectored ( ) {
572
+ let mut reader = Cursor :: new ( vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ) ;
573
+ let mut buf = [ ] ;
574
+ assert_eq ! ( reader. read_vectored( & mut [ IoVecMut :: new( & mut buf) ] ) . unwrap( ) , 0 ) ;
575
+ assert_eq ! ( reader. position( ) , 0 ) ;
576
+ let mut buf = [ 0 ] ;
577
+ assert_eq ! (
578
+ reader. read_vectored( & mut [ IoVecMut :: new( & mut [ ] ) , IoVecMut :: new( & mut buf) ] ) . unwrap( ) ,
579
+ 1 ,
580
+ ) ;
581
+ assert_eq ! ( reader. position( ) , 1 ) ;
582
+ let b: & [ _ ] = & [ 0 ] ;
583
+ assert_eq ! ( buf, b) ;
584
+ let mut buf1 = [ 0 ; 4 ] ;
585
+ let mut buf2 = [ 0 ; 4 ] ;
586
+ assert_eq ! (
587
+ reader. read_vectored(
588
+ & mut [ IoVecMut :: new( & mut buf1) , IoVecMut :: new( & mut buf2) ] ,
589
+ ) . unwrap( ) ,
590
+ 7 ,
591
+ ) ;
592
+ let b1: & [ _ ] = & [ 1 , 2 , 3 , 4 ] ;
593
+ let b2: & [ _ ] = & [ 5 , 6 , 7 ] ;
594
+ assert_eq ! ( buf1, b1) ;
595
+ assert_eq ! ( & buf2[ ..3 ] , b2) ;
596
+ assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 0 ) ;
597
+ }
598
+
450
599
#[ test]
451
600
fn test_boxed_slice_reader ( ) {
452
601
let mut reader = Cursor :: new ( vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] . into_boxed_slice ( ) ) ;
@@ -469,6 +618,35 @@ mod tests {
469
618
assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 0 ) ;
470
619
}
471
620
621
+ #[ test]
622
+ fn test_boxed_slice_reader_vectored ( ) {
623
+ let mut reader = Cursor :: new ( vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] . into_boxed_slice ( ) ) ;
624
+ let mut buf = [ ] ;
625
+ assert_eq ! ( reader. read_vectored( & mut [ IoVecMut :: new( & mut buf) ] ) . unwrap( ) , 0 ) ;
626
+ assert_eq ! ( reader. position( ) , 0 ) ;
627
+ let mut buf = [ 0 ] ;
628
+ assert_eq ! (
629
+ reader. read_vectored( & mut [ IoVecMut :: new( & mut [ ] ) , IoVecMut :: new( & mut buf) ] ) . unwrap( ) ,
630
+ 1 ,
631
+ ) ;
632
+ assert_eq ! ( reader. position( ) , 1 ) ;
633
+ let b: & [ _ ] = & [ 0 ] ;
634
+ assert_eq ! ( buf, b) ;
635
+ let mut buf1 = [ 0 ; 4 ] ;
636
+ let mut buf2 = [ 0 ; 4 ] ;
637
+ assert_eq ! (
638
+ reader. read_vectored(
639
+ & mut [ IoVecMut :: new( & mut buf1) , IoVecMut :: new( & mut buf2) ] ,
640
+ ) . unwrap( ) ,
641
+ 7 ,
642
+ ) ;
643
+ let b1: & [ _ ] = & [ 1 , 2 , 3 , 4 ] ;
644
+ let b2: & [ _ ] = & [ 5 , 6 , 7 ] ;
645
+ assert_eq ! ( buf1, b1) ;
646
+ assert_eq ! ( & buf2[ ..3 ] , b2) ;
647
+ assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 0 ) ;
648
+ }
649
+
472
650
#[ test]
473
651
fn read_to_end ( ) {
474
652
let mut reader = Cursor :: new ( vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ) ;
@@ -499,6 +677,35 @@ mod tests {
499
677
assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 0 ) ;
500
678
}
501
679
680
+ #[ test]
681
+ fn test_slice_reader_vectored ( ) {
682
+ let in_buf = vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
683
+ let reader = & mut & in_buf[ ..] ;
684
+ let mut buf = [ ] ;
685
+ assert_eq ! ( reader. read_vectored( & mut [ IoVecMut :: new( & mut buf) ] ) . unwrap( ) , 0 ) ;
686
+ let mut buf = [ 0 ] ;
687
+ assert_eq ! (
688
+ reader. read_vectored( & mut [ IoVecMut :: new( & mut [ ] ) , IoVecMut :: new( & mut buf) ] ) . unwrap( ) ,
689
+ 1 ,
690
+ ) ;
691
+ assert_eq ! ( reader. len( ) , 7 ) ;
692
+ let b: & [ _ ] = & [ 0 ] ;
693
+ assert_eq ! ( buf, b) ;
694
+ let mut buf1 = [ 0 ; 4 ] ;
695
+ let mut buf2 = [ 0 ; 4 ] ;
696
+ assert_eq ! (
697
+ reader. read_vectored(
698
+ & mut [ IoVecMut :: new( & mut buf1) , IoVecMut :: new( & mut buf2) ] ,
699
+ ) . unwrap( ) ,
700
+ 7 ,
701
+ ) ;
702
+ let b1: & [ _ ] = & [ 1 , 2 , 3 , 4 ] ;
703
+ let b2: & [ _ ] = & [ 5 , 6 , 7 ] ;
704
+ assert_eq ! ( buf1, b1) ;
705
+ assert_eq ! ( & buf2[ ..3 ] , b2) ;
706
+ assert_eq ! ( reader. read( & mut buf) . unwrap( ) , 0 ) ;
707
+ }
708
+
502
709
#[ test]
503
710
fn test_read_exact ( ) {
504
711
let in_buf = vec ! [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ;
0 commit comments