use crate::uint::U256;
pub trait CheckedCeilDiv: Sized {
fn checked_ceil_div(&self, rhs: Self) -> Option<(Self, Self)>;
}
impl CheckedCeilDiv for u128 {
fn checked_ceil_div(&self, mut rhs: Self) -> Option<(Self, Self)> {
let mut quotient = self.checked_div(rhs)?;
if quotient == 0 {
return None;
}
let remainder = self.checked_rem(rhs)?;
if remainder > 0 {
quotient = quotient.checked_add(1)?;
rhs = self.checked_div(quotient)?;
let remainder = self.checked_rem(quotient)?;
if remainder > 0 {
rhs = rhs.checked_add(1)?;
}
}
Some((quotient, rhs))
}
}
impl CheckedCeilDiv for U256 {
fn checked_ceil_div(&self, mut rhs: Self) -> Option<(Self, Self)> {
let mut quotient = self.checked_div(rhs)?;
let zero = U256::from(0);
let one = U256::from(1);
if quotient == zero {
return None;
}
let remainder = self.checked_rem(rhs)?;
if remainder > zero {
quotient = quotient.checked_add(one)?;
rhs = self.checked_div(quotient)?;
let remainder = self.checked_rem(quotient)?;
if remainder > zero {
rhs = rhs.checked_add(one)?;
}
}
Some((quotient, rhs))
}
}