1use vstd::prelude::*;
2use vstd_extra::array_ptr::{self, ArrayPtr, PointsToArray};
3
4use core::mem::MaybeUninit;
5
6verus! {
7
8pub trait Pod: Copy + Sized {
10 #[verifier::external_body]
12 fn new_zeroed() -> Self {
13 unsafe { core::mem::zeroed() }
15 }
16
17 #[verifier::external_body]
19 fn new_uninit() -> Self {
20 #[allow(clippy::uninit_assumed_init)]
22 unsafe { MaybeUninit::uninit().assume_init() }
23 }
24
25 #[verifier::external_body]
27 fn as_bytes<const N: usize>(&self) -> (slice: (
28 ArrayPtr<u8, N>,
29 Tracked<&array_ptr::PointsTo<u8, N>>,
30 ))
31 ensures
32 slice.1@.value().len() == core::mem::size_of::<Self>(),
33 slice.1@.wf(),
34 slice.0.addr() == slice.1@.addr(),
35 {
36 let ptr = self as *const Self as *const u8;
37
38 (ArrayPtr::from_addr(ptr as usize), Tracked::assume_new())
39 }
40
41 #[verifier::external_body]
43 fn as_bytes_mut(&mut self) -> (r: &mut [u8])
44 ensures
45 r.len() == core::mem::size_of::<Self>(),
46 {
47 let ptr = self as *mut Self as *mut u8;
48 let len = core::mem::size_of::<Self>();
49
50 unsafe { core::slice::from_raw_parts_mut(ptr, len) }
51 }
52
53 #[verifier::external_body]
55 fn as_bytes_ref(&self) -> (r: &[u8])
56 ensures
57 r.len() == core::mem::size_of::<Self>(),
58 {
59 let ptr = self as *const Self as *const u8;
60 let len = core::mem::size_of::<Self>();
61
62 unsafe { core::slice::from_raw_parts(ptr, len) }
63 }
64}
65
66pub trait PodOnce: Pod {
76
77}
78
79}