1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- use core::ops::{Add, Sub, Mul, Div};
- /// Performs addition that returns `None` instead of wrapping around on
- /// overflow.
- pub trait CheckedAdd: Sized + Add<Self, Output=Self> {
- /// Adds two numbers, checking for overflow. If overflow happens, `None` is
- /// returned.
- fn checked_add(&self, v: &Self) -> Option<Self>;
- }
- macro_rules! checked_impl {
- ($trait_name:ident, $method:ident, $t:ty) => {
- impl $trait_name for $t {
- #[inline]
- fn $method(&self, v: &$t) -> Option<$t> {
- <$t>::$method(*self, *v)
- }
- }
- }
- }
- checked_impl!(CheckedAdd, checked_add, u8);
- checked_impl!(CheckedAdd, checked_add, u16);
- checked_impl!(CheckedAdd, checked_add, u32);
- checked_impl!(CheckedAdd, checked_add, u64);
- checked_impl!(CheckedAdd, checked_add, usize);
- checked_impl!(CheckedAdd, checked_add, i8);
- checked_impl!(CheckedAdd, checked_add, i16);
- checked_impl!(CheckedAdd, checked_add, i32);
- checked_impl!(CheckedAdd, checked_add, i64);
- checked_impl!(CheckedAdd, checked_add, isize);
- /// Performs subtraction that returns `None` instead of wrapping around on underflow.
- pub trait CheckedSub: Sized + Sub<Self, Output=Self> {
- /// Subtracts two numbers, checking for underflow. If underflow happens,
- /// `None` is returned.
- fn checked_sub(&self, v: &Self) -> Option<Self>;
- }
- checked_impl!(CheckedSub, checked_sub, u8);
- checked_impl!(CheckedSub, checked_sub, u16);
- checked_impl!(CheckedSub, checked_sub, u32);
- checked_impl!(CheckedSub, checked_sub, u64);
- checked_impl!(CheckedSub, checked_sub, usize);
- checked_impl!(CheckedSub, checked_sub, i8);
- checked_impl!(CheckedSub, checked_sub, i16);
- checked_impl!(CheckedSub, checked_sub, i32);
- checked_impl!(CheckedSub, checked_sub, i64);
- checked_impl!(CheckedSub, checked_sub, isize);
- /// Performs multiplication that returns `None` instead of wrapping around on underflow or
- /// overflow.
- pub trait CheckedMul: Sized + Mul<Self, Output=Self> {
- /// Multiplies two numbers, checking for underflow or overflow. If underflow
- /// or overflow happens, `None` is returned.
- fn checked_mul(&self, v: &Self) -> Option<Self>;
- }
- checked_impl!(CheckedMul, checked_mul, u8);
- checked_impl!(CheckedMul, checked_mul, u16);
- checked_impl!(CheckedMul, checked_mul, u32);
- checked_impl!(CheckedMul, checked_mul, u64);
- checked_impl!(CheckedMul, checked_mul, usize);
- checked_impl!(CheckedMul, checked_mul, i8);
- checked_impl!(CheckedMul, checked_mul, i16);
- checked_impl!(CheckedMul, checked_mul, i32);
- checked_impl!(CheckedMul, checked_mul, i64);
- checked_impl!(CheckedMul, checked_mul, isize);
- /// Performs division that returns `None` instead of panicking on division by zero and instead of
- /// wrapping around on underflow and overflow.
- pub trait CheckedDiv: Sized + Div<Self, Output=Self> {
- /// Divides two numbers, checking for underflow, overflow and division by
- /// zero. If any of that happens, `None` is returned.
- fn checked_div(&self, v: &Self) -> Option<Self>;
- }
- checked_impl!(CheckedDiv, checked_div, u8);
- checked_impl!(CheckedDiv, checked_div, u16);
- checked_impl!(CheckedDiv, checked_div, u32);
- checked_impl!(CheckedDiv, checked_div, u64);
- checked_impl!(CheckedDiv, checked_div, usize);
- checked_impl!(CheckedDiv, checked_div, i8);
- checked_impl!(CheckedDiv, checked_div, i16);
- checked_impl!(CheckedDiv, checked_div, i32);
- checked_impl!(CheckedDiv, checked_div, i64);
- checked_impl!(CheckedDiv, checked_div, isize);
|