Struct bytes::buf::UninitSlice
source · #[repr(transparent)]pub struct UninitSlice(_);
Expand description
Uninitialized byte slice.
Returned by BufMut::chunk_mut()
, the referenced byte slice may be
uninitialized. The wrapper provides safe access without introducing
undefined behavior.
The safety invariants of this wrapper are:
- Reading from an
UninitSlice
is undefined behavior. - Writing uninitialized bytes to an
UninitSlice
is undefined behavior.
The difference between &mut UninitSlice
and &mut [MaybeUninit<u8>]
is
that it is possible in safe code to write uninitialized bytes to an
&mut [MaybeUninit<u8>]
, which this type prohibits.
Implementations§
source§impl UninitSlice
impl UninitSlice
sourcepub unsafe fn from_raw_parts_mut<'a>(
ptr: *mut u8,
len: usize
) -> &'a mut UninitSlice
pub unsafe fn from_raw_parts_mut<'a>( ptr: *mut u8, len: usize ) -> &'a mut UninitSlice
Create a &mut UninitSlice
from a pointer and a length.
Safety
The caller must ensure that ptr
references a valid memory region owned
by the caller representing a byte slice for the duration of 'a
.
Examples
use bytes::buf::UninitSlice;
let bytes = b"hello world".to_vec();
let ptr = bytes.as_ptr() as *mut _;
let len = bytes.len();
let slice = unsafe { UninitSlice::from_raw_parts_mut(ptr, len) };
sourcepub fn write_byte(&mut self, index: usize, byte: u8)
pub fn write_byte(&mut self, index: usize, byte: u8)
Write a single byte at the specified offset.
Panics
The function panics if index
is out of bounds.
Examples
use bytes::buf::UninitSlice;
let mut data = [b'f', b'o', b'o'];
let slice = unsafe { UninitSlice::from_raw_parts_mut(data.as_mut_ptr(), 3) };
slice.write_byte(0, b'b');
assert_eq!(b"boo", &data[..]);
sourcepub fn copy_from_slice(&mut self, src: &[u8])
pub fn copy_from_slice(&mut self, src: &[u8])
Copies bytes from src
into self
.
The length of src
must be the same as self
.
Panics
The function panics if src
has a different length than self
.
Examples
use bytes::buf::UninitSlice;
let mut data = [b'f', b'o', b'o'];
let slice = unsafe { UninitSlice::from_raw_parts_mut(data.as_mut_ptr(), 3) };
slice.copy_from_slice(b"bar");
assert_eq!(b"bar", &data[..]);
sourcepub fn as_mut_ptr(&mut self) -> *mut u8
pub fn as_mut_ptr(&mut self) -> *mut u8
Return a raw pointer to the slice’s buffer.
Safety
The caller must not read from the referenced memory and must not write uninitialized bytes to the slice either.
Examples
use bytes::BufMut;
let mut data = [0, 1, 2];
let mut slice = &mut data[..];
let ptr = BufMut::chunk_mut(&mut slice).as_mut_ptr();
sourcepub unsafe fn as_uninit_slice_mut<'a>(&'a mut self) -> &'a mut [MaybeUninit<u8>]
pub unsafe fn as_uninit_slice_mut<'a>(&'a mut self) -> &'a mut [MaybeUninit<u8>]
Return a &mut [MaybeUninit<u8>]
to this slice’s buffer.
Safety
The caller must not read from the referenced memory and must not write
uninitialized bytes to the slice either. This is because BufMut
implementation
that created the UninitSlice
knows which parts are initialized. Writing uninitalized
bytes to the slice may cause the BufMut
to read those bytes and trigger undefined
behavior.
Examples
use bytes::BufMut;
let mut data = [0, 1, 2];
let mut slice = &mut data[..];
unsafe {
let uninit_slice = BufMut::chunk_mut(&mut slice).as_uninit_slice_mut();
};
Trait Implementations§
source§impl Debug for UninitSlice
impl Debug for UninitSlice
source§impl Index<Range<usize>> for UninitSlice
impl Index<Range<usize>> for UninitSlice
§type Output = UninitSlice
type Output = UninitSlice
source§impl Index<RangeFrom<usize>> for UninitSlice
impl Index<RangeFrom<usize>> for UninitSlice
§type Output = UninitSlice
type Output = UninitSlice
source§impl Index<RangeFull> for UninitSlice
impl Index<RangeFull> for UninitSlice
§type Output = UninitSlice
type Output = UninitSlice
source§impl Index<RangeInclusive<usize>> for UninitSlice
impl Index<RangeInclusive<usize>> for UninitSlice
§type Output = UninitSlice
type Output = UninitSlice
source§fn index(&self, index: RangeInclusive<usize>) -> &UninitSlice
fn index(&self, index: RangeInclusive<usize>) -> &UninitSlice
container[index]
) operation. Read moresource§impl Index<RangeTo<usize>> for UninitSlice
impl Index<RangeTo<usize>> for UninitSlice
§type Output = UninitSlice
type Output = UninitSlice
source§impl Index<RangeToInclusive<usize>> for UninitSlice
impl Index<RangeToInclusive<usize>> for UninitSlice
§type Output = UninitSlice
type Output = UninitSlice
source§fn index(&self, index: RangeToInclusive<usize>) -> &UninitSlice
fn index(&self, index: RangeToInclusive<usize>) -> &UninitSlice
container[index]
) operation. Read moresource§impl IndexMut<RangeFull> for UninitSlice
impl IndexMut<RangeFull> for UninitSlice
source§impl IndexMut<RangeInclusive<usize>> for UninitSlice
impl IndexMut<RangeInclusive<usize>> for UninitSlice
source§fn index_mut(&mut self, index: RangeInclusive<usize>) -> &mut UninitSlice
fn index_mut(&mut self, index: RangeInclusive<usize>) -> &mut UninitSlice
container[index]
) operation. Read moresource§impl IndexMut<RangeToInclusive<usize>> for UninitSlice
impl IndexMut<RangeToInclusive<usize>> for UninitSlice
source§fn index_mut(&mut self, index: RangeToInclusive<usize>) -> &mut UninitSlice
fn index_mut(&mut self, index: RangeToInclusive<usize>) -> &mut UninitSlice
container[index]
) operation. Read more