Struct bytes::buf::UninitSlice
source · pub struct UninitSlice(/* private fields */);
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();
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