use super::*;
#[apply(nat_expr)]
pub type _BitAnd<L: NatExpr, R: NatExpr> = If<
L,
PushBit<
_BitAnd<_H<R>, _H<L>>, _And<_P<L>, _P<R>>,
>,
crate::lit!(0),
>;
#[doc(alias = "&")]
#[apply(opaque)]
#[apply(test_op! test_bit_and, L & R)]
pub type BitAnd<L, R> = _BitAnd;
#[apply(nat_expr)]
pub type _BitOr<L: NatExpr, R: NatExpr> = If<
L,
PushBit<
_BitOr<_H<R>, _H<L>>, _Or<_P<L>, _P<R>>,
>,
R,
>;
#[doc(alias = "|")]
#[apply(opaque)]
#[apply(test_op! test_bit_or, L | R)]
pub type BitOr<L, R> = _BitOr;
#[apply(nat_expr)]
pub type _BitXor<L: NatExpr, R: NatExpr> = If<
L,
PushBit<
_BitXor<_H<R>, _H<L>>, _Xor<_P<L>, _P<R>>,
>,
R,
>;
#[doc(alias = "^")]
#[apply(opaque)]
#[apply(test_op! test_bit_xor, L ^ R)]
pub type BitXor<L, R> = _BitXor;