pub struct FnSerializer<Output: OutputBuf, T: DeepView + ?Sized, Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>, Exec: Fn(&T, &mut Output)> {
pub exec_fn: Exec,
pub spec_fn: Ghost<Spec>,
pub _output: PhantomData<Output>,
pub _marker: PhantomData<T>,
}Expand description
Pairs an executable serializer closure with a ghost specification serializer.
Fields§
§exec_fn: Exec§spec_fn: Ghost<Spec>§_output: PhantomData<Output>§_marker: PhantomData<T>Implementations§
Source§impl<Output, T, Spec, Exec> FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
impl<Output, T, Spec, Exec> FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
Sourcepub exec fn new(exec_fn: Exec, Ghost(spec_fn): Ghost<Spec>) -> serializer : Self
pub exec fn new(exec_fn: Exec, Ghost(spec_fn): Ghost<Spec>) -> serializer : Self
requires
forall |v: &T, obuf: &mut Output| {
(spec_fn.consistent(v.deep_view()) && obuf.fits(spec_fn.byte_len(v.deep_view())))
==> #[trigger] call_requires(exec_fn, (v, obuf))
},forall |v: &T, obuf: &mut Output| {
(spec_fn.consistent(v.deep_view()) && #[trigger]
call_ensures(exec_fn, (v, obuf), ()))
==> {
&&& final(obuf)@ == obuf@ + spec_fn.spec_serialize(v.deep_view())
&&& forall |n| {
#[trigger] obuf.fits(spec_fn.byte_len(v.deep_view()) + n)
<==> final(obuf).fits(n)
}
&&& obuf.same_destination(final(obuf))
}
},ensuresserializer.exec_inv(),serializer.spec_fn == spec_fn,Trait Implementations§
Source§impl<Output, T, Spec, Exec> Consistency for FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
impl<Output, T, Spec, Exec> Consistency for FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
Source§impl<Output, T, Spec, Exec> GoodSerializer for FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: GoodSerializer<T = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
impl<Output, T, Spec, Exec> GoodSerializer for FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: GoodSerializer<T = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
Source§open spec fn serialize_inv(&self) -> bool
open spec fn serialize_inv(&self) -> bool
{
let Ghost(spec_fn) = self.spec_fn;
spec_fn.serialize_inv()
}Source§proof fn lemma_serialize_len(&self, v: Self::SVal)
proof fn lemma_serialize_len(&self, v: Self::SVal)
Source§impl<Output, T, Spec, Exec> Serializer<Output, T> for FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
impl<Output, T, Spec, Exec> Serializer<Output, T> for FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
Source§open spec fn exec_inv(&self) -> bool
open spec fn exec_inv(&self) -> bool
{
let Ghost(spec_fn) = self.spec_fn;
&&& forall |v: &T, obuf: &mut Output| {
(spec_fn.consistent(v.deep_view()) && obuf.fits(spec_fn.byte_len(v.deep_view())))
==> #[trigger] call_requires(self.exec_fn, (v, obuf))
}
&&& forall |v: &T, obuf: &mut Output| {
(spec_fn.consistent(v.deep_view()) && #[trigger]
call_ensures(self.exec_fn, (v, obuf), ()))
==> {
&&& final(obuf)@ == obuf@ + spec_fn.spec_serialize(v.deep_view())
&&& forall |n| {
#[trigger] obuf.fits(spec_fn.byte_len(v.deep_view()) + n)
<==> final(obuf).fits(n)
}
&&& obuf.same_destination(final(obuf))
}
}
}Source§exec fn serialize_into(&self, v: &T, obuf: &mut Output)
exec fn serialize_into(&self, v: &T, obuf: &mut Output)
Source§impl<Output, T, Spec, Exec> SpecByteLen for FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
impl<Output, T, Spec, Exec> SpecByteLen for FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
Source§impl<Output, T, Spec, Exec> SpecSerializer for FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
impl<Output, T, Spec, Exec> SpecSerializer for FnSerializer<Output, T, Spec, Exec>where
Output: OutputBuf,
T: DeepView + ?Sized,
Spec: SpecByteLen<T = T::V> + SpecSerializer<SVal = T::V> + Consistency<Val = T::V>,
Exec: Fn(&T, &mut Output),
Auto Trait Implementations§
impl<Output, T, Spec, Exec> Freeze for FnSerializer<Output, T, Spec, Exec>
impl<Output, T, Spec, Exec> RefUnwindSafe for FnSerializer<Output, T, Spec, Exec>
impl<Output, T, Spec, Exec> Send for FnSerializer<Output, T, Spec, Exec>
impl<Output, T, Spec, Exec> Sync for FnSerializer<Output, T, Spec, Exec>
impl<Output, T, Spec, Exec> Unpin for FnSerializer<Output, T, Spec, Exec>
impl<Output, T, Spec, Exec> UnsafeUnpin for FnSerializer<Output, T, Spec, Exec>where
Exec: UnsafeUnpin,
T: ?Sized,
impl<Output, T, Spec, Exec> UnwindSafe for FnSerializer<Output, T, Spec, Exec>
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