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 ($ptr:expr => $field1:tt . $field2:tt, $perm:expr) => {
15 verus_exec_expr!(
16 $ptr.borrow(Tracked($perm)).$field1.$field2
17 )};
18}
19
20#[macro_export]
21macro_rules! update_field {
22 ($ptr:expr => $field:tt <- $val:expr; $set:expr , $idx:expr) => {
23 verus_exec_expr!(
24 {
25 let tracked mut __own = $set.tracked_remove($idx);
26 let mut __tmp = $ptr.take(Tracked(&mut __own));
27 __tmp.$field = $val;
28 $ptr.put(Tracked(&mut __own), __tmp);
29 proof { $set.tracked_insert($idx, __own); }
30 })
31 };
32 ($ptr:expr => $field1:tt . $field2:tt <- $val:expr; $set:expr , $idx:expr) => {
33 verus_exec_expr!(
34 {
35 let tracked mut __own = $set.tracked_remove($idx);
36 let mut __tmp = $ptr.take(Tracked(&mut __own));
37 __tmp.$field1.$field2 = $val;
38 $ptr.put(Tracked(&mut __own), __tmp);
39 proof { $set.tracked_insert($idx, __own); }
40 })
41 };
42 ($ptr:expr => $field:tt <- $val:expr; $set:expr , $idx:expr, inner) => {
43 verus_exec_expr!(
44 {
45 let tracked mut __own = $set.tracked_remove($idx);
46 let mut __tmp = $ptr.take(Tracked(&mut __own));
47 __tmp.$field = $val;
48 $ptr.put(Tracked(&mut __own.points_to), __tmp);
49 proof { $set.tracked_insert($idx, __own); }
50 })
51 };
52 ($ptr:expr => $field1:tt . $field2:tt <- $val:expr; $set:expr , $idx:expr, inner) => {
53 verus_exec_expr!(
54 {
55 let tracked mut __own = $set.tracked_remove($idx);
56 let mut __tmp = $ptr.take(Tracked(&mut __own));
57 __tmp.$field1.$field2 = $val;
58 $ptr.put(Tracked(&mut __own.points_to), __tmp);
59 proof { $set.tracked_insert($idx, __own); }
60 })
61 };
62 ($ptr:expr => $field:tt <- $val:expr; $perm:expr) => {
63 verus_exec_expr!(
64 {
65 let mut __tmp = $ptr.take(Tracked(&mut $perm));
66 __tmp.$field = $val;
67 $ptr.put(Tracked(&mut $perm), __tmp);
68 })
69 };
70 ($ptr:expr => $field1:tt . $field2:tt <- $val:expr; $perm:expr) => {
71 verus_exec_expr!(
72 {
73 let mut __tmp = $ptr.take(Tracked(&mut $perm));
74 __tmp.$field1.$field2 = $val;
75 $ptr.put(Tracked(&mut $perm), __tmp);
76 })
77 };
78 ($ptr:expr => $field:tt += $val:expr; $perm:expr) => {
79 verus_exec_expr!(
80 {
81 let mut __tmp = $ptr.take(Tracked(&mut $perm));
82 __tmp.$field = __tmp.$field + $val;
83 $ptr.put(Tracked(&mut $perm), __tmp);
84 })
85 };
86 ($ptr:expr => $field:tt -= $val:expr; $perm:expr) => {
87 verus_exec_expr!(
88 {
89 let mut __tmp = $ptr.take(Tracked(&mut $perm));
90 __tmp.$field = __tmp.$field - $val;
91 $ptr.put(Tracked(&mut $perm), __tmp);
92 })
93 }
94}
95
96} pub use {borrow_field, update_field};