vstd/std_specs/
maybe_uninit.rs1use super::super::prelude::*;
2use super::super::raw_ptr::MemContents;
3use core::mem::MaybeUninit;
4
5use verus as verus_;
6verus_! {
7
8#[verifier::external_type_specification]
9#[verifier::external_body]
10#[verifier::accept_recursive_types(T)]
11pub struct ExMaybeUninit<T>(MaybeUninit<T>);
12
13pub trait MaybeUninitAdditionalSpecFns<T> {
14 spec fn mem_contents(self) -> MemContents<T>;
15 spec fn as_option(self) -> Option<T>;
16}
17
18impl<T> MaybeUninitAdditionalSpecFns<T> for MaybeUninit<T> {
19 uninterp spec fn mem_contents(self) -> MemContents<T>;
20
21 open spec fn as_option(self) -> Option<T> {
22 match self.mem_contents() {
23 MemContents::Init(v) => Some(v),
24 MemContents::Uninit => None,
25 }
26 }
27}
28
29pub assume_specification<T>[ MaybeUninit::<T>::new ](val: T) -> (res: MaybeUninit<T>)
30 ensures res.mem_contents() == MemContents::Init(val),
31 opens_invariants none
32 no_unwind;
33
34pub assume_specification<T>[ MaybeUninit::<T>::uninit ]() -> (res: MaybeUninit<T>)
35 ensures res.mem_contents() === MemContents::Uninit,
36 opens_invariants none
37 no_unwind;
38
39pub assume_specification<T>[ MaybeUninit::<T>::assume_init ](m: MaybeUninit<T>) -> T
40 requires m.mem_contents().is_init(),
41 returns m.mem_contents().value(),
42 opens_invariants none
43 no_unwind;
44
45pub assume_specification<T>[ MaybeUninit::<T>::assume_init_ref ](m: &MaybeUninit<T>) -> (ret: &T)
46 requires m.mem_contents().is_init(),
47 ensures ret == m.mem_contents().value(),
48 opens_invariants none
49 no_unwind;
50
51}