Union zerovec::ule::NichedOptionULE
source · #[repr(C)]
pub union NichedOptionULE<U: NicheBytes<N> + ULE, const N: usize> {
niche: [u8; N],
valid: U,
}
Expand description
ULE
type for NichedOption<U,N>
where U implements NicheBytes
.
The invalid bit pattern is used as the niche.
This uses 1 byte less than crate::ule::OptionULE<U>
to represent NichedOption<U,N>
.
§Example
use core::num::NonZeroI8;
use zerovec::ule::NichedOption;
use zerovec::ZeroVec;
let bytes = &[0x00, 0x01, 0x02, 0x00];
let zv_no: ZeroVec<NichedOption<NonZeroI8, 1>> =
ZeroVec::parse_byte_slice(bytes)
.expect("Unable to parse as NichedOption.");
assert_eq!(zv_no.get(0).map(|e| e.0), Some(None));
assert_eq!(zv_no.get(1).map(|e| e.0), Some(NonZeroI8::new(1)));
assert_eq!(zv_no.get(2).map(|e| e.0), Some(NonZeroI8::new(2)));
assert_eq!(zv_no.get(3).map(|e| e.0), Some(None));
Fields§
§niche: [u8; N]
Invariant: The value is niche
only if the bytes equal NICHE_BIT_PATTERN.
valid: U
Invariant: The value is valid
if the niche
field does not match NICHE_BIT_PATTERN.
Implementations§
Trait Implementations§
source§impl<U: NicheBytes<N> + ULE, const N: usize> Clone for NichedOptionULE<U, N>
impl<U: NicheBytes<N> + ULE, const N: usize> Clone for NichedOptionULE<U, N>
source§impl<U: NicheBytes<N> + ULE + Debug, const N: usize> Debug for NichedOptionULE<U, N>
impl<U: NicheBytes<N> + ULE + Debug, const N: usize> Debug for NichedOptionULE<U, N>
source§impl<U: NicheBytes<N> + ULE + PartialEq, const N: usize> PartialEq for NichedOptionULE<U, N>
impl<U: NicheBytes<N> + ULE + PartialEq, const N: usize> PartialEq for NichedOptionULE<U, N>
source§impl<U: NicheBytes<N> + ULE, const N: usize> ULE for NichedOptionULE<U, N>
impl<U: NicheBytes<N> + ULE, const N: usize> ULE for NichedOptionULE<U, N>
Safety for ULE trait
- NichedOptionULE does not have any padding bytes due to
#[repr(C)]
on a struct containing only ULE fields. NichedOptionULE either contains NICHE_BIT_PATTERN or valid U byte sequences. In both cases the data is initialized. - NichedOptionULE is aligned to 1 byte due to
#[repr(C, packed)]
on a struct containing only ULE fields. - validate_byte_slice impl returns an error if invalid bytes are encountered.
- validate_byte_slice impl returns an error there are extra bytes.
- The other ULE methods are left to their default impl.
- NichedOptionULE equality is based on ULE equality of the subfield, assuming that NicheBytes has been implemented correctly (this is a correctness but not a safety guarantee).
source§fn validate_byte_slice(bytes: &[u8]) -> Result<(), ZeroVecError>
fn validate_byte_slice(bytes: &[u8]) -> Result<(), ZeroVecError>
Validates a byte slice,
&[u8]
. Read moresource§fn parse_byte_slice(bytes: &[u8]) -> Result<&[Self], ZeroVecError>
fn parse_byte_slice(bytes: &[u8]) -> Result<&[Self], ZeroVecError>
source§unsafe fn from_byte_slice_unchecked(bytes: &[u8]) -> &[Self]
unsafe fn from_byte_slice_unchecked(bytes: &[u8]) -> &[Self]
Takes a byte slice,
&[u8]
, and return it as &[Self]
with the same lifetime, assuming
that this byte slice has previously been run through Self::parse_byte_slice()
with
success. Read moreimpl<U: NicheBytes<N> + ULE, const N: usize> Copy for NichedOptionULE<U, N>
impl<U: NicheBytes<N> + ULE + Eq, const N: usize> Eq for NichedOptionULE<U, N>
Auto Trait Implementations§
impl<U, const N: usize> Freeze for NichedOptionULE<U, N>where
U: Freeze,
impl<U, const N: usize> RefUnwindSafe for NichedOptionULE<U, N>where
U: RefUnwindSafe,
impl<U, const N: usize> Send for NichedOptionULE<U, N>where
U: Send,
impl<U, const N: usize> Sync for NichedOptionULE<U, N>where
U: Sync,
impl<U, const N: usize> Unpin for NichedOptionULE<U, N>where
U: Unpin,
impl<U, const N: usize> UnwindSafe for NichedOptionULE<U, N>where
U: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
🔬This is a nightly-only experimental API. (
clone_to_uninit
)