Skip to main content

Alt

Struct Alt 

Source
pub struct Alt<A, B, const NONDETERMINISTIC: bool = false>(pub A, pub B);
Expand description

Ordered alternative combinator.

Parsing semantics: like Choice, but both branches consume/produce the same type. The result is returned directly without a Sum wrapper.

Serialization semantics: if only one branch is consistent with a value, that branch is used. If both branches are consistent, serialization is intentionally underspecified and may use either branch.

§Consistency

A value v is consistent with Alt(A, B) iff it is consistent with A OR B.

§Unambiguity

Requires disjoint_domains(A, B).

§Malleability

This combinator introduces malleability by default. Non-malleability can be recovered if A is disjoint from B (see disjoint_values).

Tuple Fields§

§0: A§1: B

Implementations§

Source§

impl<const NONDETERMINISTIC: bool, A, B> Alt<A, B, NONDETERMINISTIC>
where A: Consistency, B: Consistency<Val = A::Val>,

Source

pub open spec fn choose_left(&self, v: A::Val) -> bool

{
    if NONDETERMINISTIC {
        arbitrary_or_left(self.0.consistent(v), self.1.consistent(v))
    } else {
        self.0.consistent(v)
    }
}

For non-deterministic Alt: If exactly one branch accepts v, this returns that branch. If both accept v, the choice is unspecified.

For deterministic Alt, this returns true iff the left branch accepts v.

Trait Implementations§

Source§

impl<A: Clone, B: Clone, const NONDETERMINISTIC: bool> Clone for Alt<A, B, NONDETERMINISTIC>

Source§

exec fn clone(&self) -> cloned : Self

ensures
call_ensures(A::clone, (&self.0,), cloned.0),
call_ensures(B::clone, (&self.1,), cloned.1),
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<const NONDETERMINISTIC: bool, A: Consistency, B: Consistency<Val = A::Val>> Consistency for Alt<A, B, NONDETERMINISTIC>

Source§

open spec fn consistent(&self, v: Self::Val) -> bool

{ self.0.consistent(v) || self.1.consistent(v) }
Source§

type Val = <A as Consistency>::Val

The type of values whose consistency is being checked.
Source§

impl<const NONDETERMINISTIC: bool, A, B> EquivSerializers for Alt<A, B, NONDETERMINISTIC>
where A: EquivSerializers + Consistency<Val = A::SVal>, B: EquivSerializers<SVal = A::SVal> + Consistency<Val = B::SVal>,

Source§

open spec fn equiv_inv(&self) -> bool

{
    &&& self.0.equiv_inv()
    &&& self.1.equiv_inv()

}
Source§

proof fn lemma_serialize_equiv_on_empty(&self, v: Self::SVal)

Source§

impl<const NONDETERMINISTIC: bool, A, B> EquivSerializersGeneral for Alt<A, B, NONDETERMINISTIC>
where A: EquivSerializersGeneral + Consistency<Val = A::SVal>, B: EquivSerializersGeneral<SVal = A::SVal> + Consistency<Val = B::SVal>,

Source§

open spec fn equiv_general_inv(&self) -> bool

{
    &&& self.0.equiv_general_inv()
    &&& self.1.equiv_general_inv()

}
Source§

proof fn lemma_serialize_equiv(&self, v: Self::SVal, obuf: Seq<u8>)

Source§

impl<const NONDETERMINISTIC: bool, A, B> GoodSerializer for Alt<A, B, NONDETERMINISTIC>
where A: GoodSerializer + Consistency<Val = A::SVal>, B: GoodSerializer<T = A::T> + Consistency<Val = B::SVal>,

Source§

open spec fn serialize_inv(&self) -> bool

{
    &&& self.0.serialize_inv()
    &&& self.1.serialize_inv()

}
Source§

proof fn lemma_serialize_len(&self, v: Self::SVal)

Source§

impl<const NONDETERMINISTIC: bool, Left: HasAsn1Start, Right: HasAsn1Start<PVal = Left::PVal>> HasAsn1Start for Alt<Left, Right, NONDETERMINISTIC>

Ordered alternatives have the same accepted start union as structural choices.

Source§

open spec fn asn1_start(&self) -> Asn1StartDomain

{ asn1_start_union(self.0.asn1_start(), self.1.asn1_start()) }
Source§

proof fn lemma_parse_implies_asn1_start(&self, input: Seq<u8>)

Source§

impl<const NONDETERMINISTIC: bool, A, B> MinMaxByteLen for Alt<A, B, NONDETERMINISTIC>
where A: MinMaxByteLen, B: MinMaxByteLen<T = A::T>,

Source§

open spec fn min(&self) -> nat

{ if self.0.min() <= self.1.min() { self.0.min() } else { self.1.min() } }
Source§

open spec fn max(&self) -> nat

{ if self.0.max() <= self.1.max() { self.1.max() } else { self.0.max() } }
Source§

proof fn lemma_min_max_byte_len(&self, v: Self::T)

Source§

impl<const NONDETERMINISTIC: bool, A, B> NoLookAhead for Alt<A, B, NONDETERMINISTIC>
where A: NoLookAhead, B: NoLookAhead<PVal = A::PVal>,

Source§

open spec fn no_lookahead_inv(&self) -> bool

{
    &&& self.0.no_lookahead_inv()
    &&& self.1.no_lookahead_inv()
    &&& disjoint_domains(self.0, self.1)

}
Source§

proof fn lemma_no_lookahead(&self, i1: Seq<u8>, i2: Seq<u8>)

Source§

fn corollary_non_extensible(&self, i1: Seq<u8>, i2: Seq<u8>)

Source§

impl<const NONDETERMINISTIC: bool, A, B> NonMalleable for Alt<A, B, NONDETERMINISTIC>

Source§

open spec fn nonmal_inv(&self) -> bool

{
    &&& self.0.sound_inv()
    &&& self.1.sound_inv()
    &&& self.0.nonmal_inv()
    &&& self.1.nonmal_inv()
    &&& disjoint_values(self.0, self.1)

}
Source§

proof fn lemma_parse_non_malleable(&self, buf1: Seq<u8>, buf2: Seq<u8>)

Source§

impl<const NONDETERMINISTIC: bool, A, B> NonTailFmt for Alt<A, B, NONDETERMINISTIC>
where A: NonTailFmt + Consistency<Val = A::SValue>, B: NonTailFmt<T = A::T> + Consistency<Val = B::SValue>,

Source§

open spec fn serialize_dps_inv(&self) -> bool

{
    &&& self.0.serialize_dps_inv()
    &&& self.1.serialize_dps_inv()

}
Source§

proof fn lemma_serialize_dps_prepend(&self, v: Self::SValue, obuf: Seq<u8>)

Source§

proof fn lemma_serialize_dps_len(&self, v: Self::SValue, obuf: Seq<u8>)

Source§

impl<const NONDETERMINISTIC: bool, I, A, B> Parser<I> for Alt<A, B, NONDETERMINISTIC>
where I: View<V = Seq<u8>>, A: Parser<I>, B: Parser<I, PVal = A::PVal, PT = A::PT>,

Source§

open spec fn exec_inv(&self) -> bool

{
    &&& self.0.exec_inv()
    &&& self.1.exec_inv()

}
Source§

exec fn parse(&self, ibuf: &I) -> PResult<Self::PT>

Source§

type PT = <A as Parser<I>>::PT

Executable value returned by this parser.
Source§

impl<const NONDETERMINISTIC: bool, A, B> Productive for Alt<A, B, NONDETERMINISTIC>
where A: Productive, B: Productive<PVal = A::PVal>,

Source§

open spec fn productive_inv(&self) -> bool

{
    &&& self.0.productive_inv()
    &&& self.1.productive_inv()

}
Source§

proof fn lemma_productive(&self, s: Seq<u8>)

Source§

impl<const NONDETERMINISTIC: bool, A: SPRoundTripDps, B: SPRoundTripDps<T = A::T>> SPRoundTripDps for Alt<A, B, NONDETERMINISTIC>

Source§

open spec fn unambiguous(&self) -> bool

{
    &&& self.0.unambiguous()
    &&& self.1.unambiguous()
    &&& disjoint_domains(self.0, self.1)

}
Source§

proof fn theorem_serialize_dps_parse_roundtrip(&self, v: Self::T, obuf: Seq<u8>)

Source§

impl<const NONDETERMINISTIC: bool, A, B> SafeParser for Alt<A, B, NONDETERMINISTIC>
where A: SafeParser, B: SafeParser<PVal = A::PVal>,

Source§

open spec fn safe_inv(&self) -> bool

{
    &&& self.0.safe_inv()
    &&& self.1.safe_inv()

}
Source§

proof fn lemma_parse_safe(&self, ibuf: Seq<u8>)

Source§

impl<const NONDETERMINISTIC: bool, A, B> SoundParser for Alt<A, B, NONDETERMINISTIC>
where A: SoundParser, B: SoundParser<T = A::T>,

Source§

open spec fn sound_inv(&self) -> bool

{
    &&& self.0.sound_inv()
    &&& self.1.sound_inv()
    &&& disjoint_values(self.0, self.1)

}
Source§

proof fn lemma_parse_sound_consumption(&self, ibuf: Seq<u8>)

Source§

proof fn lemma_parse_sound_value(&self, ibuf: Seq<u8>)

Source§

impl<const NONDETERMINISTIC: bool, A, B> SpecByteLen for Alt<A, B, NONDETERMINISTIC>
where A: SpecByteLen + Consistency<Val = A::T>, B: SpecByteLen<T = A::T> + Consistency<Val = B::T>,

Source§

open spec fn byte_len(&self, v: Self::T) -> nat

{ if self.choose_left(v) { self.0.byte_len(v) } else { self.1.byte_len(v) } }
Source§

type T = <A as SpecByteLen>::T

The type of values whose byte length is being computed.
Source§

impl<const NONDETERMINISTIC: bool, A: SpecParser, B: SpecParser<PVal = A::PVal>> SpecParser for Alt<A, B, NONDETERMINISTIC>

Source§

open spec fn spec_parse(&self, ibuf: Seq<u8>) -> Option<(int, Self::PVal)>

{
    if let None = self.0.spec_parse(ibuf) {
        self.1.spec_parse(ibuf)
    } else {
        self.0.spec_parse(ibuf)
    }
}
Source§

type PVal = <A as SpecParser>::PVal

The type of parsed values.
Source§

impl<const NONDETERMINISTIC: bool, A, B> SpecSerializer for Alt<A, B, NONDETERMINISTIC>
where A: SpecSerializer + Consistency<Val = A::SVal>, B: SpecSerializer<SVal = A::SVal> + Consistency<Val = B::SVal>,

Source§

open spec fn spec_serialize(&self, v: Self::SVal) -> Seq<u8>

{ if self.choose_left(v) { self.0.spec_serialize(v) } else { self.1.spec_serialize(v) } }
Source§

type SVal = <A as SpecSerializer>::SVal

The type of values to be serialized.
Source§

impl<const NONDETERMINISTIC: bool, A, B> SpecSerializerDps for Alt<A, B, NONDETERMINISTIC>
where A: SpecSerializerDps + Consistency<Val = A::SValue>, B: SpecSerializerDps<SValue = A::SValue> + Consistency<Val = B::SValue>,

Source§

open spec fn spec_serialize_dps(&self, v: Self::SValue, obuf: Seq<u8>) -> Seq<u8>

{
    if self.choose_left(v) {
        self.0.spec_serialize_dps(v, obuf)
    } else {
        self.1.spec_serialize_dps(v, obuf)
    }
}
Source§

type SValue = <A as SpecSerializerDps>::SValue

The type of values to be serialized.
Source§

impl<A: Copy, B: Copy, const NONDETERMINISTIC: bool> Copy for Alt<A, B, NONDETERMINISTIC>

Auto Trait Implementations§

§

impl<A, B, const NONDETERMINISTIC: bool> Freeze for Alt<A, B, NONDETERMINISTIC>
where A: Freeze, B: Freeze,

§

impl<A, B, const NONDETERMINISTIC: bool> RefUnwindSafe for Alt<A, B, NONDETERMINISTIC>

§

impl<A, B, const NONDETERMINISTIC: bool> Send for Alt<A, B, NONDETERMINISTIC>
where A: Send, B: Send,

§

impl<A, B, const NONDETERMINISTIC: bool> Sync for Alt<A, B, NONDETERMINISTIC>
where A: Sync, B: Sync,

§

impl<A, B, const NONDETERMINISTIC: bool> Unpin for Alt<A, B, NONDETERMINISTIC>
where A: Unpin, B: Unpin,

§

impl<A, B, const NONDETERMINISTIC: bool> UnsafeUnpin for Alt<A, B, NONDETERMINISTIC>
where A: UnsafeUnpin, B: UnsafeUnpin,

§

impl<A, B, const NONDETERMINISTIC: bool> UnwindSafe for Alt<A, B, NONDETERMINISTIC>
where A: UnwindSafe, B: 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

Source§

impl<C> NonAmbiguous for C
where C: SPRoundTrip,

Source§

open spec fn nonamb_inv(&self) -> bool

{ self.sp_roundtrip_inv() }
Source§

proof fn lemma_serialize_injective( &self, v1: <C as Consistency>::Val, v2: <C as Consistency>::Val, )

Source§

fn corollary_serialize_injective_contrapositive( &self, v1: Self::Val, v2: Self::Val, )

Source§

impl<C> PSRoundTrip for C

Source§

open spec fn ps_roundtrip_inv(&self) -> bool

{ self.safe_inv() && self.sound_inv() && self.nonmal_inv() && self.sp_roundtrip_inv() }
Source§

proof fn theorem_parse_serialize_roundtrip(&self, ibuf: Seq<u8>)

Source§

fn corollary_parse_non_malleable(&self, buf1: Seq<u8>, buf2: Seq<u8>)

Source§

impl<C> SPRoundTrip for C

Source§

open spec fn sp_roundtrip_inv(&self) -> bool

{ self.serialize_inv() && self.equiv_inv() && self.unambiguous() }
Source§

proof fn theorem_serialize_parse_roundtrip(&self, v: <C as SpecByteLen>::T)

Source§

impl<T, S> SerializerExt<T> for S
where S: SpecByteLen<T = <T as DeepView>::V> + SpecSerializer<SVal = <T as DeepView>::V> + Consistency<Val = <T as DeepView>::V>, T: DeepView + ?Sized,

Source§

fn serialize<'a>(&self, v: &T, obuf: &'a mut [u8])
where Self: Serializer<OutputSlice<'a>, T>,

Source§

fn serialize_with_vec(&self, v: &T, obuf: &mut Vec<u8>)
where Self: Serializer<Vec<u8>, T>,

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>

Source§

impl<T> SpecCombinator for T
where T: SpecParser<PVal = <T as SpecByteLen>::T> + SpecByteLen + SpecSerializer<SVal = <T as SpecByteLen>::T> + Consistency<Val = <T as SpecByteLen>::T> + SpecSerializerDps<SValue = <T as SpecByteLen>::T>,

§

impl<A> SpecEq<&A> for A
where A: ?Sized,

§

impl<A> SpecEq<&mut A> for A
where A: ?Sized,

§

impl<A> SpecEq<A> for A
where A: ?Sized,

§

impl<A> SpecEq<Ghost<A>> for A

§

impl<A> SpecEq<Tracked<A>> for A

Source§

impl<Body> StrictCombinator for Body