use super::*;
type _SubIfGe<L, R> = If<
_Lt<L, R>, L,
_SubUnchecked<L, R>,
>;
#[apply(nat_expr)]
pub type _NaiveRem<L: NatExpr, R: NatExpr> = If<
L,
PushBit<
_RemUnchecked<_H<L>, R>, _P<L>,
>,
crate::lit!(0),
>;
pub(crate) type _RemUnchecked<L, R> = _SubIfGe<_NaiveRem<L, R>, R>;
#[apply(nat_expr)]
pub type _DivUnchecked<L: NatExpr, R: NatExpr> = If<
L,
PushBit<
_DivUnchecked<_H<L>, R>, IsZero<_Lt<_NaiveRem<L, R>, R>>,
>,
crate::lit!(0),
>;
#[apply(nat_expr)]
pub type _Rem<L: NatExpr, R: NatExpr> = If<
R,
_RemUnchecked<L, R>,
L,
>;
#[doc = op_examples!(
Rem,
(5, 2) == 1,
(11, 4) == 3,
)]
#[doc = op_examples!(
Rem,
(0, 0) == 0,
(7, 0) == 7,
)]
#[doc(alias = "%")]
#[doc(alias = "modulo")]
#[apply(opaque)]
#[apply(test_op!
test_rem,
L % R,
..,
1..
)]
pub type Rem<L, R> = _Rem;
#[apply(nat_expr)]
pub type _Div<L: NatExpr, R: NatExpr> = If<
R,
_DivUnchecked<L, R>,
crate::lit!(0),
>;
#[doc = op_examples!(
Div,
(5, 2) == 2,
(11, 4) == 2,
)]
#[doc = op_examples!(
Div,
(0, 0) == 0,
(7, 0) == 0,
)]
#[doc(alias = "/")]
#[apply(opaque)]
#[apply(test_op!
test_div,
L / R,
..,
1..,
)]
pub type Div<L, R> = _Div;