Skip to main content

Snapshot

Struct Snapshot 

Source
pub struct Snapshot<T: ?Sized>(/* private fields */);
Expand description

A copyable snapshot, usable in pearlite.

The Snapshot type contains the logical value of some data, in a purely immutable way. It is zero sized.

Creating a snapshot does not move the ownership of a value.

§Pearlite syntax

In executable code, you may create a snapshot with the snapshot! macro. Inside this macro, you may write pearlite code; this code will not run during the normal execution of the program.

§Example

let x: Snapshot<Int> = snapshot!(1);
let m: Snapshot<Mapping<Int, Int>> = snapshot!(|x| x + 1);

Implementations§

Source§

impl<T: ?Sized> Snapshot<T>

Source

pub fn new(value: T) -> Snapshot<T>

Create a new snapshot in logic code.

logic

Source§

impl<T> Snapshot<T>

Source

pub fn inner(self) -> T

Get the value of the snapshot.

When possible, you should instead use the dereference operator.

§Example
let x = snapshot!(1);
proof_assert!(x.inner() == 1);
proof_assert!(*x == 1); // prefer this

logic

Source

pub fn into_ghost(self) -> Ghost<T>
where T: Plain,

Extract a plain value from a snapshot in ghost code.

ensures

*result == *self

terminates

ghost

Trait Implementations§

Source§

impl<T: ?Sized> Clone for Snapshot<T>

Source§

fn clone(&self) -> Self

terminates

ghost

ensures

result == *self

1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<T: ?Sized> Deref for Snapshot<T>

Available on creusot only.
Source§

fn deref(&self) -> &Self::Target

logic

Source§

type Target = T

The resulting type after dereferencing.
Source§

impl<T: ?Sized> DerefMut for Snapshot<T>

Available on creusot only.
Source§

fn deref_mut(&mut self) -> &mut Self::Target

logic

Source§

impl<T: ?Sized + Fin> Fin for Snapshot<T>

Source§

fn fin<'a>(self) -> &'a Self::Target

logic(open, prophetic, inline)

&^*self

Source§

type Target = <T as Fin>::Target

Source§

impl<R: RA> LocalUpdate<R> for Snapshot<(R, R)>

Apply a ‘raw’ local update.

This will update the value of the authority/fragment to the provided pair.

Source§

fn premise(self, from_auth: R, from_frag: R) -> bool

logic(open, inline)

forall<f: Option<R>>
    Some(from_frag).op(f) == Some(Some(from_auth)) ==>
    Some(self.1).op(f) == Some(Some(self.0))
Source§

fn update(self, _: R, _: R) -> (R, R)

logic(open, inline)

*self

Source§

fn frame_preserving(self, from_auth: R, from_frag: R, frame: Option<R>)

logic

requires

LocalUpdate::premise(self, from_auth, from_frag)

requires

Some(from_frag).op(frame) == Some(Some(from_auth))

ensures

let (to_auth, to_frag) = LocalUpdate::update(self, from_auth, from_frag);
Some(to_frag).op(frame) == Some(Some(to_auth))
Source§

impl<R: RA, Choice> Update<R> for Snapshot<Mapping<Choice, R>>

Apply a ‘raw’ non-deterministic update.

This changes the state of the resource to one of the values of the mapping, non-deterministically.

Source§

fn premise(self, from: R) -> bool

logic(open, inline)

forall<y: R> from.op(y) != None ==>
    exists<ch: Choice> self[ch].op(y) != None
Source§

fn update(self, from: R, ch: Choice) -> R

logic(open, inline)

self[ch]

requires

self.premise(from)

Source§

fn frame_preserving(self, from: R, frame: R) -> Choice

logic

requires

self.premise(from)

requires

from.op(frame) != None

ensures

self.update(from, result).op(frame) != None

Source§

type Choice = Choice

If the update is non-deterministic, it will pick a choice of this type for the update.
Source§

impl<R: RA> Update<R> for Snapshot<R>

Apply a ‘raw’ update.

This changes the state of the resource from one value to another. The premise of this change is that no existing composition with the resource is invalidated.

Source§

fn premise(self, from: R) -> bool

logic(open, inline)

forall<y: R> from.op(y) != None ==> self.op(y) != None

Source§

fn update(self, from: R, _: ()) -> R

logic(open, inline)

*self

requires

self.premise(from)

Source§

fn frame_preserving(self, from: R, frame: R)

logic

requires

self.premise(from)

requires

from.op(frame) != None

ensures

self.update(from, result).op(frame) != None

Source§

type Choice = ()

If the update is non-deterministic, it will pick a choice of this type for the update.
Source§

impl<T: ?Sized> Copy for Snapshot<T>

Auto Trait Implementations§

§

impl<T> Freeze for Snapshot<T>
where T: ?Sized,

§

impl<T> Objective for Snapshot<T>
where T: Objective + ?Sized,

§

impl<T> RefUnwindSafe for Snapshot<T>
where T: RefUnwindSafe + ?Sized,

§

impl<T> Send for Snapshot<T>
where T: Send + ?Sized,

§

impl<T> Sync for Snapshot<T>
where T: Sync + ?Sized,

§

impl<T> Unpin for Snapshot<T>
where T: Unpin + ?Sized,

§

impl<T> UnsafeUnpin for Snapshot<T>
where T: ?Sized,

§

impl<T> UnwindSafe for Snapshot<T>
where T: UnwindSafe + ?Sized,

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.

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.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
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.
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.