Skip to main content

cvlr_asserts/
asserts.rs

1#[rustfmt::skip]
2macro_rules! impl_bin_assert {
3    ($name: ident, $pred: tt, $dollar: tt) => {
4        #[macro_export]
5        macro_rules! $name {
6        ($lhs: expr, $rhs: expr $dollar(, $desc: literal)? ) => {{
7            let __cvlr_lhs = $lhs;
8            let __cvlr_rhs = $rhs;
9            cvlr::log::log_scope_start("assert");
10            cvlr::clog!(stringify!($lhs $pred $rhs) => "_");
11            cvlr::clog!(__cvlr_lhs => stringify!($lhs));
12            cvlr::clog!(__cvlr_rhs => stringify!($rhs));
13            cvlr::log::log_scope_end("assert");
14            $crate::cvlr_assert!(__cvlr_lhs $pred __cvlr_rhs);
15        }};
16    }
17        pub use $name;
18    };
19}
20
21impl_bin_assert!(cvlr_assert_eq, ==, $);
22impl_bin_assert!(cvlr_assert_ne, !=, $);
23impl_bin_assert!(cvlr_assert_le, <=, $);
24impl_bin_assert!(cvlr_assert_lt, <, $);
25impl_bin_assert!(cvlr_assert_ge, >=, $);
26impl_bin_assert!(cvlr_assert_gt, >, $);
27
28#[rustfmt::skip]
29macro_rules! impl_bin_assume {
30    ($name: ident, $pred: tt, $dollar: tt) => {
31        #[macro_export]
32        macro_rules! $name {
33        ($lhs: expr, $rhs: expr $dollar(, $desc: literal)? ) => {{
34            let __cvlr_lhs = $lhs;
35            let __cvlr_rhs = $rhs;
36            cvlr::log::log_scope_start("assume");
37            cvlr::clog!(stringify!($lhs $pred $rhs) => "_");
38            cvlr::clog!(__cvlr_lhs => stringify!($lhs));
39            cvlr::clog!(__cvlr_rhs => stringify!($rhs));
40            cvlr::log::log_scope_end("assume");
41            $crate::cvlr_assume!(__cvlr_lhs $pred __cvlr_rhs);
42        }};
43    }
44        pub use $name;
45    };
46}
47
48impl_bin_assume!(cvlr_assume_eq, ==, $);
49impl_bin_assume!(cvlr_assume_ne, !=, $);
50impl_bin_assume!(cvlr_assume_le, <=, $);
51impl_bin_assume!(cvlr_assume_lt, <, $);
52impl_bin_assume!(cvlr_assume_ge, >=, $);
53impl_bin_assume!(cvlr_assume_gt, >, $);
54
55#[macro_export]
56macro_rules! cvlr_assert_if {
57    ($guard: expr, $cond: expr) => {
58        if $guard {
59            $crate::cvlr_assert!($cond);
60        }
61    };
62}
63
64#[rustfmt::skip]
65macro_rules! impl_bin_assert_if {
66    ($name: ident, $pred: tt, $dollar: tt) => {
67        #[macro_export]
68        macro_rules! $name {
69        ($guard: expr,$lhs: expr, $rhs: expr $dollar(, $desc: literal)? ) => {{
70            let __cvlr_guard = $guard;
71            cvlr::clog!(stringify!(assert if $guard { $lhs $pred $rhs }) => "_");
72            cvlr::clog!(__cvlr_guard => stringify!($guard));
73            if __cvlr_guard {
74                let __cvlr_lhs = $lhs;
75                let __cvlr_rhs = $rhs;
76                cvlr::clog!(__cvlr_lhs => stringify!($lhs));
77                cvlr::clog!(__cvlr_rhs => stringify!($rhs));
78                $crate::cvlr_assert!(__cvlr_lhs $pred __cvlr_rhs);
79            }
80        }};
81    }
82        pub use $name;
83    };
84}
85
86impl_bin_assert_if!(cvlr_assert_eq_if, ==, $);
87impl_bin_assert_if!(cvlr_assert_ne_if, !=, $);
88impl_bin_assert_if!(cvlr_assert_le_if, <=, $);
89impl_bin_assert_if!(cvlr_assert_lt_if, <, $);
90impl_bin_assert_if!(cvlr_assert_ge_if, >=, $);
91impl_bin_assert_if!(cvlr_assert_gt_if, >, $);