#![warn(
missing_docs,
missing_debug_implementations,
missing_copy_implementations,
trivial_casts,
trivial_numeric_casts,
unused_extern_crates,
unused_import_braces,
unused_qualifications,
unused_results,
variant_size_differences,
)]
pub use repr::Repr;
mod repr;
#[macro_use]
mod macros;
pub trait BoundedInteger: Copy + Eq + Ord {
type Repr: Repr;
fn from_repr(repr: Self::Repr) -> Option<Self>;
fn to_repr(self) -> Self::Repr;
fn min_value() -> Self;
fn max_value() -> Self;
fn checked_add(self, other: Self) -> Option<Self> {
self.checked_add_repr(other.to_repr())
}
fn checked_sub(self, other: Self) -> Option<Self> {
self.checked_sub_repr(other.to_repr())
}
fn checked_mul(self, other: Self) -> Option<Self> {
self.checked_mul_repr(other.to_repr())
}
fn checked_div(self, other: Self) -> Option<Self> {
self.checked_div_repr(other.to_repr())
}
fn checked_rem(self, other: Self) -> Option<Self> {
self.checked_rem_repr(other.to_repr())
}
fn checked_neg(self) -> Option<Self> {
self.to_repr().checked_neg().and_then(Self::from_repr)
}
fn checked_add_repr(self, other: Self::Repr) -> Option<Self> {
self.to_repr().checked_add(other).and_then(Self::from_repr)
}
fn checked_sub_repr(self, other: Self::Repr) -> Option<Self> {
self.to_repr().checked_sub(other).and_then(Self::from_repr)
}
fn checked_mul_repr(self, other: Self::Repr) -> Option<Self> {
self.to_repr().checked_mul(other).and_then(Self::from_repr)
}
fn checked_div_repr(self, other: Self::Repr) -> Option<Self> {
self.to_repr().checked_div(other).and_then(Self::from_repr)
}
fn checked_rem_repr(self, other: Self::Repr) -> Option<Self> {
self.to_repr().checked_rem(other).and_then(Self::from_repr)
}
fn saturating_add(self, other: Self) -> Self {
self.saturating_add_repr(other.to_repr())
}
fn saturating_sub(self, other: Self) -> Self {
self.saturating_sub_repr(other.to_repr())
}
fn saturating_mul(self, other: Self) -> Self {
self.saturating_mul_repr(other.to_repr())
}
fn saturating_add_repr(self, other: Self::Repr) -> Self {
if other.is_negative() {
self.checked_add_repr(other).unwrap_or(Self::min_value())
} else {
self.checked_add_repr(other).unwrap_or(Self::max_value())
}
}
fn saturating_sub_repr(self, other: Self::Repr) -> Self {
if other.is_negative() {
self.checked_sub_repr(other).unwrap_or(Self::max_value())
} else {
self.checked_sub_repr(other).unwrap_or(Self::min_value())
}
}
fn saturating_mul_repr(self, other: Self::Repr) -> Self {
if self.to_repr().is_negative() == other.is_negative() {
self.checked_mul_repr(other).unwrap_or(Self::max_value())
} else {
self.checked_mul_repr(other).unwrap_or(Self::min_value())
}
}
}