use super::*;
#[apply(nat_expr!
eval_attrs = { #[doc(hidden)] },
)]
pub type PopBit<N: NatExpr> = InternalOp!(crate::Eval<N>, PopBit);
#[apply(nat_expr!
eval_attrs = { #[doc(hidden)] },
)]
pub type LastBit<N: NatExpr> = InternalOp!(crate::Eval<N>, LastBit);
#[apply(nat_expr!
eval_attrs = { #[doc(hidden)] },
)]
pub type PushBit<N: NatExpr, P: NatExpr> =
InternalOp!(crate::Eval<P>, PushSelfAsBit<crate::Eval<N>>);
#[apply(nat_expr!
eval_attrs = { #[doc(hidden)] },
)]
pub type If<C: NatExpr, T: NatExpr, F: NatExpr> = InternalOp!(crate::Eval<C>, If<T, F>);
#[apply(nat_expr!
eval_attrs = { #[doc(hidden)] },
)]
pub type Opaque<P: NatExpr, Out: NatExpr> = crate::Eval<InternalOp!(crate::Eval<P>, Opaque<Out>)>;
#[test]
fn opaqueness_tests() {
struct Namespace<L, R>(L, R);
trait Fallback {
const PROVEN_IDENTICAL: bool;
}
impl<X> Namespace<X, X> {
const PROVEN_IDENTICAL: bool = true;
}
impl<L, R> Fallback for Namespace<L, R> {
const PROVEN_IDENTICAL: bool = false;
}
macro_rules! check_proven_identical {
($expect:expr, $lhs:ty, $rhs:ty) => {
assert!($expect == Namespace::<$lhs, $rhs>::PROVEN_IDENTICAL)
};
}
fn accept<A: NatExpr, B: NatExpr>() {
check_proven_identical!(true, crate::Eval<If<crate::lit!(1), A, B>>, crate::Eval<A>);
check_proven_identical!(true, crate::Eval<If<crate::lit!(0), A, B>>, crate::Eval<B>);
check_proven_identical!(true, crate::Eval<Opaque<crate::lit!(0), A>>, crate::Eval<A>);
check_proven_identical!(false, crate::Eval<Opaque<B, A>>, crate::Eval<A>);
check_proven_identical!(false, crate::Eval<Opaque<B, A>>, Opaque<A, A>);
check_proven_identical!(
false,
crate::Eval<PopBit<PushBit<crate::lit!(0), A>>>,
crate::lit!(0)
);
}
accept::<crate::lit!(3), crate::lit!(7)>();
}