use vstd::prelude::*;
verus! {
pub open spec fn set_if(before: bool, after: bool, selected: bool) -> bool {
after == if selected { true } else { before }
}
pub proof fn selected_unset_rejected(before: bool)
ensures !set_if(before, false, true),
{
}
pub open spec fn clear_if(before: bool, after: bool, selected: bool) -> bool {
after == if selected { false } else { before }
}
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct Marker {
pub marked: bool,
}
impl Marker {
pub fn new(marked: bool) -> (marker: Self)
ensures marker.marked == marked,
{
Self { marked }
}
pub fn is_marked(&self) -> (marked: bool)
ensures marked == self.marked,
{
self.marked
}
pub fn set(&mut self) -> (changed: bool)
ensures
final(self).marked,
changed == !old(self).marked,
{
let changed = !self.marked;
self.marked = true;
changed
}
pub fn clear(&mut self) -> (changed: bool)
ensures
!final(self).marked,
changed == old(self).marked,
{
let changed = self.marked;
self.marked = false;
changed
}
}
}