pub struct LinkedListOwner<M: AnyFrameMeta + Repr<MetaSlotSmall>> {
pub list: Seq<LinkOwner>,
pub perms: Map<int, PointsTo<MetaSlot, Metadata<Link<M>>>>,
pub list_id: u64,
}Fields§
§list: Seq<LinkOwner>§perms: Map<int, PointsTo<MetaSlot, Metadata<Link<M>>>>§list_id: u64Implementations§
Source§impl<M: AnyFrameMeta + Repr<MetaSlotSmall>> LinkedListOwner<M>
impl<M: AnyFrameMeta + Repr<MetaSlotSmall>> LinkedListOwner<M>
Sourcepub open spec fn inv_at(self, i: int) -> bool
pub open spec fn inv_at(self, i: int) -> bool
{
&&& self.perms.contains_key(i)
&&& self.perms[i].addr() == self.list[i].paddr
&&& self.perms[i].points_to.addr() == self.list[i].paddr
&&& self.perms[i].wf(&self.perms[i].inner_perms)
&&& self.perms[i].addr() % META_SLOT_SIZE == 0
&&& FRAME_METADATA_RANGE.start <= self.perms[i].addr()
< FRAME_METADATA_RANGE.start + MAX_NR_PAGES * META_SLOT_SIZE
&&& self.perms[i].is_init()
&&& self.perms[i].value().metadata.wf(self.list[i])
&&& i == 0 <==> self.perms[i].value().metadata.prev is None
&&& i == self.list.len() - 1 <==> self.perms[i].value().metadata.next is None
&&& 0 < i
==> {
&&& self.perms[i].value().metadata.prev is Some
&&& self.perms[i].value().metadata.prev.unwrap().addr()
== self.perms[i - 1].addr()
&&& self.perms[i].value().metadata.prev.unwrap().ptr
== self.perms[i - 1].points_to.pptr()
}
&&& i < self.list.len() - 1
==> {
&&& self.perms[i].value().metadata.next is Some
&&& self.perms[i].value().metadata.next.unwrap().addr()
== self.perms[i + 1].addr()
&&& self.perms[i].value().metadata.next.unwrap().ptr
== self.perms[i + 1].points_to.pptr()
}
&&& self.list[i].inv()
&&& self.list[i].in_list == self.list_id
}Sourcepub open spec fn view_helper(owners: Seq<LinkOwner>) -> Seq<LinkModel>
pub open spec fn view_helper(owners: Seq<LinkOwner>) -> Seq<LinkModel>
{
if owners.len() == 0 {
Seq::<LinkModel>::empty()
} else {
seq![owners[0].view()].add(Self::view_helper(owners.remove(0)))
}
}Sourcepub proof fn view_preserves_len(owners: Seq<LinkOwner>)
pub proof fn view_preserves_len(owners: Seq<LinkOwner>)
ensures
Self::view_helper(owners).len() == owners.len(),Sourcepub proof fn view_helper_index(owners: Seq<LinkOwner>, i: int)
pub proof fn view_helper_index(owners: Seq<LinkOwner>, i: int)
requires
0 <= i < owners.len(),ensuresSelf::view_helper(owners)[i] == owners[i].view(),Proves that view_helper preserves indexing: view_helper(s)[i] == s[i].view()
Sourcepub proof fn view_helper_remove(owners: Seq<LinkOwner>, i: int)
pub proof fn view_helper_remove(owners: Seq<LinkOwner>, i: int)
requires
0 <= i < owners.len(),ensuresSelf::view_helper(owners.remove(i)) =~= Self::view_helper(owners).remove(i),Proves that view_helper commutes with remove: view_helper(s.remove(i)) =~= view_helper(s).remove(i)
Sourcepub proof fn view_helper_insert(owners: Seq<LinkOwner>, i: int, v: LinkOwner)
pub proof fn view_helper_insert(owners: Seq<LinkOwner>, i: int, v: LinkOwner)
requires
0 <= i <= owners.len(),ensuresSelf::view_helper(owners.insert(i, v)) =~= Self::view_helper(owners).insert(i, v.view()),Proves that view_helper commutes with insert: view_helper(s.insert(i, v)) =~= view_helper(s).insert(i, v.view())
Trait Implementations§
Source§impl<M: AnyFrameMeta + Repr<MetaSlotSmall>> Inv for LinkedListOwner<M>
impl<M: AnyFrameMeta + Repr<MetaSlotSmall>> Inv for LinkedListOwner<M>
Source§impl<M: AnyFrameMeta + Repr<MetaSlotSmall>> InvView for LinkedListOwner<M>
impl<M: AnyFrameMeta + Repr<MetaSlotSmall>> InvView for LinkedListOwner<M>
Source§proof fn view_preserves_inv(self)
proof fn view_preserves_inv(self)
Source§impl<M: AnyFrameMeta + Repr<MetaSlotSmall>> View for LinkedListOwner<M>
impl<M: AnyFrameMeta + Repr<MetaSlotSmall>> View for LinkedListOwner<M>
Auto Trait Implementations§
impl<M> Freeze for LinkedListOwner<M>
impl<M> !RefUnwindSafe for LinkedListOwner<M>
impl<M> Send for LinkedListOwner<M>where
M: Send,
impl<M> Sync for LinkedListOwner<M>where
M: Sync,
impl<M> Unpin for LinkedListOwner<M>where
M: Unpin,
impl<M> UnwindSafe for LinkedListOwner<M>where
M: UnwindSafe,
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