mod abstraction;
pub use abstraction::*;
pub mod int;
pub use int::*;
pub mod prop;
pub use prop::*;
#[cfg(feature = "macros")]
pub use crate::proc_macros::*;
#[doc(hidden)]
#[cfg(hax)]
#[macro_export]
macro_rules! proxy_macro_if_not_hax {
($macro:path, no, $($arg:tt)*) => {
()
};
($macro:path, $f:expr, $cond:expr$(, $($arg:tt)*)?) => {
$f($cond)
};
}
#[cfg(not(debug_assertions))]
#[doc(hidden)]
#[cfg(not(hax))]
#[macro_export]
macro_rules! proxy_macro_if_not_hax {
($macro:path, $f:expr, $($arg:tt)*) => {};
}
#[cfg(debug_assertions)]
#[doc(hidden)]
#[cfg(not(hax))]
#[macro_export]
macro_rules! proxy_macro_if_not_hax {
($macro:path, $f:expr, $($arg:tt)*) => {
$macro!($($arg)*)
};
}
#[macro_export]
macro_rules! debug_assert {
($($arg:tt)*) => {
$crate::proxy_macro_if_not_hax!(::core::debug_assert, no, $($arg)*)
};
}
#[macro_export]
macro_rules! assert {
($($arg:tt)*) => {
$crate::proxy_macro_if_not_hax!(::core::assert, $crate::assert, $($arg)*)
};
}
#[doc(hidden)]
#[cfg(hax)]
pub fn assert(_formula: bool) {}
#[macro_export]
macro_rules! assert_prop {
($($arg:tt)*) => {
{
#[cfg(hax)]
{
$crate::assert_prop(::hax_lib::Prop::from($($arg)*));
}
}
};
}
#[doc(hidden)]
#[cfg(hax)]
pub fn assert_prop(_formula: Prop) {}
#[doc(hidden)]
#[cfg(hax)]
pub fn assume(_formula: Prop) {}
#[cfg(hax)]
#[macro_export]
macro_rules! assume {
($formula:expr) => {
$crate::assume(::hax_lib::Prop::from($formula))
};
}
#[cfg(not(hax))]
#[macro_export]
macro_rules! assume {
($formula:expr) => {
()
};
}
#[doc(hidden)]
pub fn inline(_: &str) {}
#[doc(hidden)]
pub fn inline_unsafe<T>(_: &str) -> T {
unreachable!()
}
#[doc(hidden)]
pub fn any_to_unit<T>(_: T) -> () {
unreachable!()
}
#[doc(hidden)]
pub fn _internal_loop_invariant<T, R: Into<Prop>, P: FnOnce(T) -> R>(_: P) {}
#[doc(hidden)]
pub const fn _internal_while_loop_invariant(_: Prop) {}
#[doc(hidden)]
pub fn _internal_loop_decreases(_: Int) {}
pub trait Refinement {
type InnerType;
fn new(x: Self::InnerType) -> Self;
fn get(self) -> Self::InnerType;
fn get_mut(&mut self) -> &mut Self::InnerType;
fn invariant(value: Self::InnerType) -> Prop;
}
pub trait RefineAs<RefinedType> {
fn into_checked(self) -> RefinedType;
}