Union zerovec::ule::niche::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§

source§

impl<U: NicheBytes<N> + ULE, const N: usize> NichedOptionULE<U, N>

source

pub fn new(opt: Option<U>) -> Self

New NichedOptionULE<U, N> from Option<U>

source

pub fn get(self) -> Option<U>

Convert to an Option<U>

Trait Implementations§

source§

impl<U: NicheBytes<N> + ULE, const N: usize> Clone for NichedOptionULE<U, N>

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<U: NicheBytes<N> + ULE + Debug, const N: usize> Debug for NichedOptionULE<U, N>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<U: NicheBytes<N> + ULE + PartialEq, const N: usize> PartialEq for NichedOptionULE<U, N>

source§

fn eq(&self, other: &Self) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<U: NicheBytes<N> + ULE, const N: usize> ULE for NichedOptionULE<U, N>

Safety for ULE trait

  1. 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.
  2. NichedOptionULE is aligned to 1 byte due to #[repr(C, packed)] on a struct containing only ULE fields.
  3. validate_byte_slice impl returns an error if invalid bytes are encountered.
  4. validate_byte_slice impl returns an error there are extra bytes.
  5. The other ULE methods are left to their default impl.
  6. 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>

Validates a byte slice, &[u8]. Read more
source§

fn parse_byte_slice(bytes: &[u8]) -> Result<&[Self], ZeroVecError>

Parses a byte slice, &[u8], and return it as &[Self] with the same lifetime. Read more
source§

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 more
source§

fn as_byte_slice(slice: &[Self]) -> &[u8]

Given &[Self], returns a &[u8] with the same lifetime. Read more
source§

impl<U: NicheBytes<N> + ULE, const N: usize> Copy for NichedOptionULE<U, N>

source§

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> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> ErasedDestructor for T
where T: 'static,