1
1
use core:: iter:: { FromIterator , Iterator } ;
2
- use core:: mem:: { self , ManuallyDrop } ;
2
+ use core:: mem:: { self , ManuallyDrop , MaybeUninit } ;
3
3
use core:: ops:: { Deref , DerefMut } ;
4
4
use core:: ptr:: { self , NonNull } ;
5
5
use core:: { cmp, fmt, hash, isize, slice, usize} ;
@@ -766,11 +766,11 @@ impl BytesMut {
766
766
self . reserve ( cnt) ;
767
767
768
768
unsafe {
769
- let dst = self . uninit_slice ( ) ;
769
+ let dst = self . spare_capacity_mut ( ) ;
770
770
// Reserved above
771
771
debug_assert ! ( dst. len( ) >= cnt) ;
772
772
773
- ptr:: copy_nonoverlapping ( extend. as_ptr ( ) , dst. as_mut_ptr ( ) , cnt) ;
773
+ ptr:: copy_nonoverlapping ( extend. as_ptr ( ) , dst. as_mut_ptr ( ) . cast ( ) , cnt) ;
774
774
}
775
775
776
776
unsafe {
@@ -992,13 +992,42 @@ impl BytesMut {
992
992
self . data = invalid_ptr ( ( pos << VEC_POS_OFFSET ) | ( prev & NOT_VEC_POS_MASK ) ) ;
993
993
}
994
994
995
+ /// Returns the remaining spare capacity of the buffer as a slice of `MaybeUninit<u8>`.
996
+ ///
997
+ /// The returned slice can be used to fill the buffer with data (e.g. by
998
+ /// reading from a file) before marking the data as initialized using the
999
+ /// [`set_len`] method.
1000
+ ///
1001
+ /// [`set_len`]: BytesMut::set_len
1002
+ ///
1003
+ /// # Examples
1004
+ ///
1005
+ /// ```
1006
+ /// use bytes::BytesMut;
1007
+ ///
1008
+ /// // Allocate buffer big enough for 10 bytes.
1009
+ /// let mut buf = BytesMut::with_capacity(10);
1010
+ ///
1011
+ /// // Fill in the first 3 elements.
1012
+ /// let uninit = buf.spare_capacity_mut();
1013
+ /// uninit[0].write(0);
1014
+ /// uninit[1].write(1);
1015
+ /// uninit[2].write(2);
1016
+ ///
1017
+ /// // Mark the first 3 bytes of the buffer as being initialized.
1018
+ /// unsafe {
1019
+ /// buf.set_len(3);
1020
+ /// }
1021
+ ///
1022
+ /// assert_eq!(&buf[..], &[0, 1, 2]);
1023
+ /// ```
995
1024
#[ inline]
996
- fn uninit_slice ( & mut self ) -> & mut UninitSlice {
1025
+ pub fn spare_capacity_mut ( & mut self ) -> & mut [ MaybeUninit < u8 > ] {
997
1026
unsafe {
998
1027
let ptr = self . ptr . as_ptr ( ) . add ( self . len ) ;
999
1028
let len = self . cap - self . len ;
1000
1029
1001
- UninitSlice :: from_raw_parts_mut ( ptr, len)
1030
+ slice :: from_raw_parts_mut ( ptr. cast ( ) , len)
1002
1031
}
1003
1032
}
1004
1033
}
@@ -1072,7 +1101,7 @@ unsafe impl BufMut for BytesMut {
1072
1101
if self . capacity ( ) == self . len ( ) {
1073
1102
self . reserve ( 64 ) ;
1074
1103
}
1075
- self . uninit_slice ( )
1104
+ UninitSlice :: from_slice ( self . spare_capacity_mut ( ) )
1076
1105
}
1077
1106
1078
1107
// Specialize these methods so they can skip checking `remaining_mut`
@@ -1097,7 +1126,7 @@ unsafe impl BufMut for BytesMut {
1097
1126
fn put_bytes ( & mut self , val : u8 , cnt : usize ) {
1098
1127
self . reserve ( cnt) ;
1099
1128
unsafe {
1100
- let dst = self . uninit_slice ( ) ;
1129
+ let dst = self . spare_capacity_mut ( ) ;
1101
1130
// Reserved above
1102
1131
debug_assert ! ( dst. len( ) >= cnt) ;
1103
1132
0 commit comments