1use vstd::prelude::*;
2
3use vstd::simple_pptr::*;
4
5verus! {
6
7#[macro_export]
8macro_rules! borrow_field {
9 ($ptr:expr) => { $ptr };
10 ($ptr:expr => $field:tt, $perm:expr) => {
11 verus_exec_expr!(
12 $ptr.borrow(Tracked($perm)).$field
13 )};
14}
15
16#[macro_export]
17macro_rules! update_field {
18 ($ptr:expr => $field:tt <- $val:expr; $set:expr , $idx:expr) => {
19 verus_exec_expr!(
20 {
21 let tracked mut __own = $set.tracked_remove($idx);
22 let mut __tmp = $ptr.take(Tracked(&mut __own));
23 __tmp.$field = $val;
24 $ptr.put(Tracked(&mut __own), __tmp);
25 proof { $set.tracked_insert($idx, __own); }
26 })
27 };
28 ($ptr:expr => $field:tt <- $val:expr; $perm:expr) => {
29 verus_exec_expr!(
30 {
31 let mut __tmp = $ptr.take(Tracked(&mut $perm));
32 __tmp.$field = $val;
33 $ptr.put(Tracked(&mut $perm), __tmp);
34 })
35 };
36 ($ptr:expr => $field:tt += $val:expr; $perm:expr) => {
37 verus_exec_expr!(
38 {
39 let mut __tmp = $ptr.take(Tracked(&mut $perm));
40 __tmp.$field = __tmp.$field + $val;
41 $ptr.put(Tracked(&mut $perm), __tmp);
42 })
43 };
44 ($ptr:expr => $field:tt -= $val:expr; $perm:expr) => {
45 verus_exec_expr!(
46 {
47 let mut __tmp = $ptr.take(Tracked(&mut $perm));
48 __tmp.$field = __tmp.$field - $val;
49 $ptr.put(Tracked(&mut $perm), __tmp);
50 })
51 }
52}
53
54} pub use {borrow_field, update_field};