Skip to main content

Either

Enum Either 

Source
pub enum Either<L, R> {
    Left(L),
    Right(R),
}
Expand description

A type containing either a Left value L or a Right value R.

Variants§

§

Left(L)

Contains the left value

§

Right(R)

Contains the right value

Implementations§

Source§

impl<L, R> Either<L, R>

Source

pub fn left(self) -> Option<L>

Converts to the left value, if any.

Source

pub fn __VERUS_SPEC_left(self) -> Option<L>

Source

pub fn right(self) -> Option<R>

Converts to the right value, if any.

Source

pub fn __VERUS_SPEC_right(self) -> Option<R>

Source

pub fn is_left(&self) -> bool

Returns true if the left value is present.

Source

pub fn __VERUS_SPEC_is_left(&self) -> bool

Source

pub fn is_right(&self) -> bool

Returns true if the right value is present.

Source

pub fn __VERUS_SPEC_is_right(&self) -> bool

Trait Implementations§

Source§

impl<L: Clone, R: Clone> Clone for Either<L, R>

Source§

fn clone(&self) -> Either<L, R>

Returns a duplicate 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<L: Debug, R: Debug> Debug for Either<L, R>

Source§

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

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

impl<L: NonNullPtr, R: NonNullPtr> NonNullPtr for Either<L, R>

Source§

exec fn into_raw(self) -> ret : (NonNull<Self::Target>, Tracked<Self::Permission>)

Source§

unsafe exec fn from_raw( ptr: NonNull<Self::Target>, verus_tmp_perm: Tracked<Self::Permission>, ) -> Self

Source§

open spec fn ptr_perm_match(ptr: NonNull<Self::Target>, perm: Self::Permission) -> bool

{
    let tag = 1usize << Self::ALIGN_BITS;
    match perm {
        Sum::Left(left) => (
            &&& ptr.view_ptr_mut().addr() & tag == 0
            &&& L::ptr_perm_match(ptr.cast(), left)

        ),
        Sum::Right(right) => {
            let untagged_ptr = ptr
                .view_ptr_mut()
                .with_addr((ptr.view_ptr_mut().addr() & !tag));
            let right_nonnull = nonnull_from_ptr_mut_spec(untagged_ptr);
            &&& ptr.view_ptr_mut().addr() & tag == tag
            &&& (ptr.view_ptr_mut().addr() & !tag) != 0
            &&& R::ptr_perm_match(right_nonnull.cast(), right)

        }
    }
}
Source§

open spec fn rel_perm(self, perm: Self::Permission) -> bool

{
    match (self, perm) {
        (Either::Left(left), Sum::Left(left_perm)) => left.rel_perm(left_perm),
        (Either::Right(right), Sum::Right(right_perm)) => right.rel_perm(right_perm),
        _ => false,
    }
}
Source§

proof fn lemma_align_bits_range()

ensures
Self::ALIGN_BITS
    == if L::ALIGN_BITS < R::ALIGN_BITS { L::ALIGN_BITS - 1 } else { R::ALIGN_BITS - 1 },
Source§

const ALIGN_BITS: u32

The power of two of the pointer alignment.
Source§

type Target = PhantomData<Either<L, R>>

The target type that this pointer refers to.
Source§

type Permission = Sum<<L as NonNullPtr>::Permission, <R as NonNullPtr>::Permission>

A verification-only permission type that represents the ownership of the memory managed by the pointer.
Source§

impl<'a, L: NonNullPtrRef<'a>, R: NonNullPtrRef<'a>> NonNullPtrRef<'a> for Either<L, R>

Source§

open spec fn ref_perm_view_permission(perm: Self::RefPermission) -> Self::Permission

{
    match perm {
        Sum::Left(left) => Sum::Left(L::ref_perm_view_permission(left)),
        Sum::Right(right) => Sum::Right(R::ref_perm_view_permission(right)),
    }
}
Source§

open spec fn ref_rel_perm(r: Self::Ref, perm: Self::RefPermission) -> bool

{ true }
Source§

proof fn lemma_ref_perm_inv_impl_perm_inv(perm: Self::RefPermission)

Source§

unsafe exec fn raw_as_ref( raw: NonNull<Self::Target>, verus_tmp_perm: Tracked<Self::RefPermission>, ) -> Self::Ref

Source§

exec fn ref_as_raw( ptr_ref: Self::Ref, ) -> (NonNull<Self::Target>, Tracked<Self::RefPermission>)

Source§

type Ref = Either<<L as NonNullPtrRef<'a>>::Ref, <R as NonNullPtrRef<'a>>::Ref>

Source§

type RefPermission = Sum<<L as NonNullPtrRef<'a>>::RefPermission, <R as NonNullPtrRef<'a>>::RefPermission>

A verification-only permission type that represents the reading permission of the memory managed by the pointer.
Source§

impl<L: PartialEq, R: PartialEq> PartialEq for Either<L, R>

Source§

fn eq(&self, other: &Either<L, R>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

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

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<L: Copy, R: Copy> Copy for Either<L, R>

Source§

impl<L: Eq, R: Eq> Eq for Either<L, R>

Source§

impl<L, R> StructuralPartialEq for Either<L, R>

Auto Trait Implementations§

§

impl<L, R> Freeze for Either<L, R>
where L: Freeze, R: Freeze,

§

impl<L, R> RefUnwindSafe for Either<L, R>

§

impl<L, R> Send for Either<L, R>
where L: Send, R: Send,

§

impl<L, R> Sync for Either<L, R>
where L: Sync, R: Sync,

§

impl<L, R> Unpin for Either<L, R>
where L: Unpin, R: Unpin,

§

impl<L, R> UnsafeUnpin for Either<L, R>
where L: UnsafeUnpin, R: UnsafeUnpin,

§

impl<L, R> UnwindSafe for Either<L, R>
where L: UnwindSafe, R: 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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, VERUS_SPEC__A> FromSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: From<T>,

§

fn obeys_from_spec() -> bool

§

fn from_spec(v: T) -> VERUS_SPEC__A

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.

§

impl<T, VERUS_SPEC__A> IntoSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: Into<T>,

§

fn obeys_into_spec() -> bool

§

fn into_spec(self) -> T

§

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

§

fn obeys_into_spec() -> bool

§

fn into_spec(self) -> U

§

impl<A, Rhs> PartialEqIs<Rhs> for A
where A: PartialEq<Rhs> + ?Sized, Rhs: ?Sized,

§

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

§

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

§

impl<Rhs, VERUS_SPEC__A> PartialEqSpec<Rhs> for VERUS_SPEC__A
where VERUS_SPEC__A: PartialEq<Rhs> + ?Sized, Rhs: ?Sized,

§

fn obeys_eq_spec() -> bool

§

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

Source§

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

Source§

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>,

Source§

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.
§

impl<T, VERUS_SPEC__A> TryFromSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: TryFrom<T>,

§

fn obeys_try_from_spec() -> bool

§

fn try_from_spec( v: T, ) -> Result<VERUS_SPEC__A, <VERUS_SPEC__A as TryFrom<T>>::Error>

Source§

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

Source§

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.
§

impl<T, VERUS_SPEC__A> TryIntoSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: TryInto<T>,

§

fn obeys_try_into_spec() -> bool

§

fn try_into_spec(self) -> Result<T, <VERUS_SPEC__A as TryInto<T>>::Error>

§

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

§

fn obeys_try_into_spec() -> bool

§

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