@@ -439,6 +439,27 @@ fn slice_write_vectored(
439
439
Ok ( nwritten)
440
440
}
441
441
442
+ #[ inline]
443
+ fn slice_write_all ( pos_mut : & mut u64 , slice : & mut [ u8 ] , buf : & [ u8 ] ) -> io:: Result < ( ) > {
444
+ let n = slice_write ( pos_mut, slice, buf) ?;
445
+ if n < buf. len ( ) { Err ( io:: Error :: WRITE_ALL_EOF ) } else { Ok ( ( ) ) }
446
+ }
447
+
448
+ #[ inline]
449
+ fn slice_write_all_vectored (
450
+ pos_mut : & mut u64 ,
451
+ slice : & mut [ u8 ] ,
452
+ bufs : & [ IoSlice < ' _ > ] ,
453
+ ) -> io:: Result < ( ) > {
454
+ for buf in bufs {
455
+ let n = slice_write ( pos_mut, slice, buf) ?;
456
+ if n < buf. len ( ) {
457
+ return Err ( io:: Error :: WRITE_ALL_EOF ) ;
458
+ }
459
+ }
460
+ Ok ( ( ) )
461
+ }
462
+
442
463
/// Reserves the required space, and pads the vec with 0s if necessary.
443
464
fn reserve_and_pad < A : Allocator > (
444
465
pos_mut : & mut u64 ,
@@ -481,9 +502,12 @@ fn reserve_and_pad<A: Allocator>(
481
502
Ok ( pos)
482
503
}
483
504
484
- /// Writes the slice to the vec without allocating
485
- /// # Safety: vec must have buf.len() spare capacity
486
- unsafe fn vec_write_unchecked < A > ( pos : usize , vec : & mut Vec < u8 , A > , buf : & [ u8 ] ) -> usize
505
+ /// Writes the slice to the vec without allocating.
506
+ ///
507
+ /// # Safety
508
+ ///
509
+ /// `vec` must have `buf.len()` spare capacity.
510
+ unsafe fn vec_write_all_unchecked < A > ( pos : usize , vec : & mut Vec < u8 , A > , buf : & [ u8 ] ) -> usize
487
511
where
488
512
A : Allocator ,
489
513
{
@@ -492,7 +516,7 @@ where
492
516
pos + buf. len ( )
493
517
}
494
518
495
- /// Resizing write implementation for [`Cursor`]
519
+ /// Resizing `write_all` implementation for [`Cursor`].
496
520
///
497
521
/// Cursor is allowed to have a pre-allocated and initialised
498
522
/// vector body, but with a position of 0. This means the [`Write`]
@@ -501,7 +525,7 @@ where
501
525
/// This also allows for the vec body to be empty, but with a position of N.
502
526
/// This means that [`Write`] will pad the vec with 0 initially,
503
527
/// before writing anything from that point
504
- fn vec_write < A > ( pos_mut : & mut u64 , vec : & mut Vec < u8 , A > , buf : & [ u8 ] ) -> io:: Result < usize >
528
+ fn vec_write_all < A > ( pos_mut : & mut u64 , vec : & mut Vec < u8 , A > , buf : & [ u8 ] ) -> io:: Result < usize >
505
529
where
506
530
A : Allocator ,
507
531
{
@@ -512,7 +536,7 @@ where
512
536
// Safety: we have ensured that the capacity is available
513
537
// and that all bytes get written up to pos
514
538
unsafe {
515
- pos = vec_write_unchecked ( pos, vec, buf) ;
539
+ pos = vec_write_all_unchecked ( pos, vec, buf) ;
516
540
if pos > vec. len ( ) {
517
541
vec. set_len ( pos) ;
518
542
}
@@ -523,7 +547,7 @@ where
523
547
Ok ( buf_len)
524
548
}
525
549
526
- /// Resizing write_vectored implementation for [`Cursor`]
550
+ /// Resizing `write_all_vectored` implementation for [`Cursor`].
527
551
///
528
552
/// Cursor is allowed to have a pre-allocated and initialised
529
553
/// vector body, but with a position of 0. This means the [`Write`]
@@ -532,7 +556,7 @@ where
532
556
/// This also allows for the vec body to be empty, but with a position of N.
533
557
/// This means that [`Write`] will pad the vec with 0 initially,
534
558
/// before writing anything from that point
535
- fn vec_write_vectored < A > (
559
+ fn vec_write_all_vectored < A > (
536
560
pos_mut : & mut u64 ,
537
561
vec : & mut Vec < u8 , A > ,
538
562
bufs : & [ IoSlice < ' _ > ] ,
@@ -550,7 +574,7 @@ where
550
574
// and that all bytes get written up to the last pos
551
575
unsafe {
552
576
for buf in bufs {
553
- pos = vec_write_unchecked ( pos, vec, buf) ;
577
+ pos = vec_write_all_unchecked ( pos, vec, buf) ;
554
578
}
555
579
if pos > vec. len ( ) {
556
580
vec. set_len ( pos) ;
@@ -579,6 +603,16 @@ impl Write for Cursor<&mut [u8]> {
579
603
true
580
604
}
581
605
606
+ #[ inline]
607
+ fn write_all ( & mut self , buf : & [ u8 ] ) -> io:: Result < ( ) > {
608
+ slice_write_all ( & mut self . pos , self . inner , buf)
609
+ }
610
+
611
+ #[ inline]
612
+ fn write_all_vectored ( & mut self , bufs : & mut [ IoSlice < ' _ > ] ) -> io:: Result < ( ) > {
613
+ slice_write_all_vectored ( & mut self . pos , self . inner , bufs)
614
+ }
615
+
582
616
#[ inline]
583
617
fn flush ( & mut self ) -> io:: Result < ( ) > {
584
618
Ok ( ( ) )
@@ -591,18 +625,28 @@ where
591
625
A : Allocator ,
592
626
{
593
627
fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
594
- vec_write ( & mut self . pos , self . inner , buf)
628
+ vec_write_all ( & mut self . pos , self . inner , buf)
595
629
}
596
630
597
631
fn write_vectored ( & mut self , bufs : & [ IoSlice < ' _ > ] ) -> io:: Result < usize > {
598
- vec_write_vectored ( & mut self . pos , self . inner , bufs)
632
+ vec_write_all_vectored ( & mut self . pos , self . inner , bufs)
599
633
}
600
634
601
635
#[ inline]
602
636
fn is_write_vectored ( & self ) -> bool {
603
637
true
604
638
}
605
639
640
+ fn write_all ( & mut self , buf : & [ u8 ] ) -> io:: Result < ( ) > {
641
+ vec_write_all ( & mut self . pos , self . inner , buf) ?;
642
+ Ok ( ( ) )
643
+ }
644
+
645
+ fn write_all_vectored ( & mut self , bufs : & mut [ IoSlice < ' _ > ] ) -> io:: Result < ( ) > {
646
+ vec_write_all_vectored ( & mut self . pos , self . inner , bufs) ?;
647
+ Ok ( ( ) )
648
+ }
649
+
606
650
fn write_fmt ( & mut self , fmt : fmt:: Arguments < ' _ > ) -> io:: Result < ( ) > {
607
651
self . inner . reserve ( fmt. estimated_capacity ( ) ) ;
608
652
io:: default_write_fmt ( self , fmt)
@@ -620,18 +664,28 @@ where
620
664
A : Allocator ,
621
665
{
622
666
fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
623
- vec_write ( & mut self . pos , & mut self . inner , buf)
667
+ vec_write_all ( & mut self . pos , & mut self . inner , buf)
624
668
}
625
669
626
670
fn write_vectored ( & mut self , bufs : & [ IoSlice < ' _ > ] ) -> io:: Result < usize > {
627
- vec_write_vectored ( & mut self . pos , & mut self . inner , bufs)
671
+ vec_write_all_vectored ( & mut self . pos , & mut self . inner , bufs)
628
672
}
629
673
630
674
#[ inline]
631
675
fn is_write_vectored ( & self ) -> bool {
632
676
true
633
677
}
634
678
679
+ fn write_all ( & mut self , buf : & [ u8 ] ) -> io:: Result < ( ) > {
680
+ vec_write_all ( & mut self . pos , & mut self . inner , buf) ?;
681
+ Ok ( ( ) )
682
+ }
683
+
684
+ fn write_all_vectored ( & mut self , bufs : & mut [ IoSlice < ' _ > ] ) -> io:: Result < ( ) > {
685
+ vec_write_all_vectored ( & mut self . pos , & mut self . inner , bufs) ?;
686
+ Ok ( ( ) )
687
+ }
688
+
635
689
fn write_fmt ( & mut self , fmt : fmt:: Arguments < ' _ > ) -> io:: Result < ( ) > {
636
690
self . inner . reserve ( fmt. estimated_capacity ( ) ) ;
637
691
io:: default_write_fmt ( self , fmt)
@@ -663,6 +717,16 @@ where
663
717
true
664
718
}
665
719
720
+ #[ inline]
721
+ fn write_all ( & mut self , buf : & [ u8 ] ) -> io:: Result < ( ) > {
722
+ slice_write_all ( & mut self . pos , & mut self . inner , buf)
723
+ }
724
+
725
+ #[ inline]
726
+ fn write_all_vectored ( & mut self , bufs : & mut [ IoSlice < ' _ > ] ) -> io:: Result < ( ) > {
727
+ slice_write_all_vectored ( & mut self . pos , & mut self . inner , bufs)
728
+ }
729
+
666
730
#[ inline]
667
731
fn flush ( & mut self ) -> io:: Result < ( ) > {
668
732
Ok ( ( ) )
@@ -686,6 +750,16 @@ impl<const N: usize> Write for Cursor<[u8; N]> {
686
750
true
687
751
}
688
752
753
+ #[ inline]
754
+ fn write_all ( & mut self , buf : & [ u8 ] ) -> io:: Result < ( ) > {
755
+ slice_write_all ( & mut self . pos , & mut self . inner , buf)
756
+ }
757
+
758
+ #[ inline]
759
+ fn write_all_vectored ( & mut self , bufs : & mut [ IoSlice < ' _ > ] ) -> io:: Result < ( ) > {
760
+ slice_write_all_vectored ( & mut self . pos , & mut self . inner , bufs)
761
+ }
762
+
689
763
#[ inline]
690
764
fn flush ( & mut self ) -> io:: Result < ( ) > {
691
765
Ok ( ( ) )
0 commit comments