pub struct Resource<RA: ResourceAlgebra> { /* private fields */ }Expand description
Interface for Resource Algebra ghost state.
Implementations§
Source§impl<RA: ResourceAlgebra> Resource<RA>
impl<RA: ResourceAlgebra> Resource<RA>
Sourcepub proof fn as_ref(tracked &self) -> tracked r : ResourceRef<'_, RA>
pub proof fn as_ref(tracked &self) -> tracked r : ResourceRef<'_, RA>
self.loc() == r.loc(),self.value() == r.value(),Source§impl<RA: ResourceAlgebra> Resource<RA>
Implementation of a Resource based on a ResourceAlgebra
impl<RA: ResourceAlgebra> Resource<RA>
Implementation of a Resource based on a ResourceAlgebra
Sourcepub proof fn alloc(value: RA) -> tracked out : Self
pub proof fn alloc(value: RA) -> tracked out : Self
value.valid(),ensuresout.value() == value,Allocate a new resource at a fresh location
Sourcepub proof fn join(tracked self, tracked other: Self) -> tracked out : Self
pub proof fn join(tracked self, tracked other: Self) -> tracked out : Self
self.loc() == other.loc(),ensuresout.loc() == self.loc(),out.value() == RA::op(self.value(), other.value()),We can join together two resources at the same location, where we obtain the combination of the two
Sourcepub proof fn split(tracked self, left: RA, right: RA) -> tracked out : (Self, Self)
pub proof fn split(tracked self, left: RA, right: RA) -> tracked out : (Self, Self)
self.value() == RA::op(left, right),ensuresout.0.loc() == self.loc(),out.1.loc() == self.loc(),out.0.value() == left,out.1.value() == right,If a resource holds the result of a composition, we can split it into the components
Sourcepub proof fn validate(tracked &self)
pub proof fn validate(tracked &self)
self.value().valid(),Whenever we have a resource, that resource is valid. This intuitively (and inductively)
holds because:
1. We only create valid resources (via alloc);
2. We can only update the value of a resource via a frame_preserving_update_opt (see
update for more details. Because of the requirement of that
updates are frame preserving this means that joins remain valid.
Sourcepub proof fn update_nondeterministic(tracked self, new_values: Set<RA>) -> tracked out : Self
pub proof fn update_nondeterministic(tracked self, new_values: Set<RA>) -> tracked out : Self
frame_preserving_update_nondeterministic_opt(self.value(), new_values),ensuresout.loc() == self.loc(),new_values.contains(out.value()),This is a more general version of update.
Sourcepub proof fn update(tracked self, new_value: RA) -> tracked out : Self
pub proof fn update(tracked self, new_value: RA) -> tracked out : Self
frame_preserving_update_opt(self.value(), new_value),ensuresout.loc() == self.loc(),out.value() == new_value,Update a resource to a new value. This can only be done if the update is frame preserving (i.e., any value that could be composed with the original value can still be composed with the new value).
See frame_preserving_update for more information.
Sourcepub proof fn extract(tracked &mut self) -> tracked other : Self
pub proof fn extract(tracked &mut self) -> tracked other : Self
other.loc() == old(self).loc(),other.value() == old(self).value(),Extracts the resource from r, leaving r unspecified and returning
a new resource holding the previous value of r.
Sourcepub proof fn validate_2(tracked &mut self, tracked other: &ResourceRef<'_, RA>)
pub proof fn validate_2(tracked &mut self, tracked other: &ResourceRef<'_, RA>)
old(self).loc() == other.loc(),ensures*self == *old(self),RA::op(self.value(), other.value()).valid(),Validate two items at once. If we have two resources at the same location then its composition is valid.
self.loc() == other.loc(),frame_preserving_update_nondeterministic_opt(
RA::op(self.value(), other.value()),
set_op(new_values, other.value()),
),ensuresout.loc() == self.loc(),new_values.contains(out.value()),We can do a similar update to update_with_shared for non-deterministic updates
self.loc() == other.loc(),frame_preserving_update_opt(
RA::op(self.value(), other.value()),
RA::op(new_value, other.value()),
),ensuresout.loc() == self.loc(),out.value() == new_value,If x · y --> x · z is a frame-perserving update, and we have a shared reference to x,
we can update the y resource to z.
Auto Trait Implementations§
impl<RA> Freeze for Resource<RA>
impl<RA> RefUnwindSafe for Resource<RA>where
RA: RefUnwindSafe,
impl<RA> Send for Resource<RA>where
RA: Send,
impl<RA> Sync for Resource<RA>where
RA: Sync,
impl<RA> Unpin for Resource<RA>where
RA: Unpin,
impl<RA> UnsafeUnpin for Resource<RA>
impl<RA> UnwindSafe for Resource<RA>where
RA: 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
Source§impl<T, U> IntoSpecImpl<U> for Twhere
U: From<T>,
impl<T, U> IntoSpecImpl<U> for Twhere
U: From<T>,
Source§impl<T, VERUS_SPEC__A> TryFromSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: TryFrom<T>,
impl<T, VERUS_SPEC__A> TryFromSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: TryFrom<T>,
Source§exec fn obeys_try_from_spec() -> bool
exec fn obeys_try_from_spec() -> bool
Source§impl<T, VERUS_SPEC__A> TryIntoSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: TryInto<T>,
impl<T, VERUS_SPEC__A> TryIntoSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: TryInto<T>,
Source§exec fn obeys_try_into_spec() -> bool
exec fn obeys_try_into_spec() -> bool
Source§impl<T, U> TryIntoSpecImpl<U> for Twhere
U: TryFrom<T>,
impl<T, U> TryIntoSpecImpl<U> for Twhere
U: TryFrom<T>,
Source§open spec fn obeys_try_into_spec() -> bool
open spec fn obeys_try_into_spec() -> bool
{ <U as TryFromSpec<Self>>::obeys_try_from_spec() }