@@ -22,10 +22,44 @@ use core::ops::{
22
22
pub struct UninitSlice ( [ MaybeUninit < u8 > ] ) ;
23
23
24
24
impl UninitSlice {
25
- pub ( crate ) fn from_slice ( slice : & mut [ MaybeUninit < u8 > ] ) -> & mut UninitSlice {
25
+ /// Creates a `&mut UninitSlice` wrapping slice of uninitialised memory.
26
+ ///
27
+ /// # Examples
28
+ ///
29
+ /// ```
30
+ /// use bytes::buf::UninitSlice;
31
+ /// use core::mem::MaybeUninit;
32
+ ///
33
+ /// let mut buffer = [MaybeUninit::uninit(); 64];
34
+ /// let slice = UninitSlice::from_uninit_slice(&mut buffer[..]);
35
+ ///
36
+ /// let mut vec = Vec::with_capacity(1024);
37
+ /// let spare: &mut UninitSlice = vec.spare_capacity_mut().into();
38
+ /// ```
39
+ #[ inline]
40
+ pub fn from_uninit_slice ( slice : & mut [ MaybeUninit < u8 > ] ) -> & mut UninitSlice {
26
41
unsafe { & mut * ( slice as * mut [ MaybeUninit < u8 > ] as * mut UninitSlice ) }
27
42
}
28
43
44
+ fn from_uninit_slice_ref ( slice : & [ MaybeUninit < u8 > ] ) -> & UninitSlice {
45
+ unsafe { & * ( slice as * const [ MaybeUninit < u8 > ] as * const UninitSlice ) }
46
+ }
47
+
48
+ /// Creates a `&mut UninitSlice` wrapping slice of initialised memory.
49
+ ///
50
+ /// # Examples
51
+ ///
52
+ /// ```
53
+ /// use bytes::buf::UninitSlice;
54
+ ///
55
+ /// let mut buffer = [0u8; 64];
56
+ /// let slice = UninitSlice::from_slice(&mut buffer[..]);
57
+ /// ```
58
+ #[ inline]
59
+ pub fn from_slice ( slice : & mut [ u8 ] ) -> & mut UninitSlice {
60
+ unsafe { & mut * ( slice as * mut [ u8 ] as * mut [ MaybeUninit < u8 > ] as * mut UninitSlice ) }
61
+ }
62
+
29
63
/// Create a `&mut UninitSlice` from a pointer and a length.
30
64
///
31
65
/// # Safety
@@ -48,7 +82,7 @@ impl UninitSlice {
48
82
pub unsafe fn from_raw_parts_mut < ' a > ( ptr : * mut u8 , len : usize ) -> & ' a mut UninitSlice {
49
83
let maybe_init: & mut [ MaybeUninit < u8 > ] =
50
84
core:: slice:: from_raw_parts_mut ( ptr as * mut _ , len) ;
51
- Self :: from_slice ( maybe_init)
85
+ Self :: from_uninit_slice ( maybe_init)
52
86
}
53
87
54
88
/// Write a single byte at the specified offset.
@@ -179,6 +213,18 @@ impl fmt::Debug for UninitSlice {
179
213
}
180
214
}
181
215
216
+ impl < ' a > From < & ' a mut [ u8 ] > for & ' a mut UninitSlice {
217
+ fn from ( slice : & ' a mut [ u8 ] ) -> Self {
218
+ UninitSlice :: from_slice ( slice)
219
+ }
220
+ }
221
+
222
+ impl < ' a > From < & ' a mut [ MaybeUninit < u8 > ] > for & ' a mut UninitSlice {
223
+ fn from ( slice : & ' a mut [ MaybeUninit < u8 > ] ) -> Self {
224
+ UninitSlice :: from_uninit_slice ( slice)
225
+ }
226
+ }
227
+
182
228
macro_rules! impl_index {
183
229
( $( $t: ty) ,* ) => {
184
230
$(
@@ -187,16 +233,14 @@ macro_rules! impl_index {
187
233
188
234
#[ inline]
189
235
fn index( & self , index: $t) -> & UninitSlice {
190
- let maybe_uninit: & [ MaybeUninit <u8 >] = & self . 0 [ index] ;
191
- unsafe { & * ( maybe_uninit as * const [ MaybeUninit <u8 >] as * const UninitSlice ) }
236
+ UninitSlice :: from_uninit_slice_ref( & self . 0 [ index] )
192
237
}
193
238
}
194
239
195
240
impl IndexMut <$t> for UninitSlice {
196
241
#[ inline]
197
242
fn index_mut( & mut self , index: $t) -> & mut UninitSlice {
198
- let maybe_uninit: & mut [ MaybeUninit <u8 >] = & mut self . 0 [ index] ;
199
- unsafe { & mut * ( maybe_uninit as * mut [ MaybeUninit <u8 >] as * mut UninitSlice ) }
243
+ UninitSlice :: from_uninit_slice( & mut self . 0 [ index] )
200
244
}
201
245
}
202
246
) *
0 commit comments