/// Performs addition that returns `None` instead of wrapping around on overflow.
pub trait CheckedAdd: Add<Self, Self> {
/// Adds two numbers, checking for overflow. If overflow happens, `None` is returned.
+ ///
+ /// # Example
+ ///
+ /// ```rust
+ /// use std::num::CheckedAdd;
+ /// assert_eq!(5u16.checked_add(&65530), Some(65535));
+ /// assert_eq!(6u16.checked_add(&65530), None);
+ /// ```
fn checked_add(&self, v: &Self) -> Option<Self>;
}
/// Performs subtraction that returns `None` instead of wrapping around on underflow.
pub trait CheckedSub: Sub<Self, Self> {
/// Subtracts two numbers, checking for underflow. If underflow happens, `None` is returned.
+ ///
+ /// # Example
+ ///
+ /// ```rust
+ /// use std::num::CheckedSub;
+ /// assert_eq!((-127i8).checked_sub(&1), Some(-128));
+ /// assert_eq!((-128i8).checked_sub(&1), None);
+ /// ```
fn checked_sub(&self, v: &Self) -> Option<Self>;
}
pub trait CheckedMul: Mul<Self, Self> {
/// Multiplies two numbers, checking for underflow or overflow. If underflow or overflow
/// happens, `None` is returned.
+ ///
+ /// # Example
+ ///
+ /// ```rust
+ /// use std::num::CheckedMul;
+ /// assert_eq!(5u8.checked_mul(&51), Some(255));
+ /// assert_eq!(5u8.checked_mul(&52), None);
+ /// ```
fn checked_mul(&self, v: &Self) -> Option<Self>;
}
pub trait CheckedDiv: Div<Self, Self> {
/// Divides two numbers, checking for underflow or overflow. If underflow or overflow happens,
/// `None` is returned.
+ ///
+ /// # Example
+ ///
+ /// ```rust
+ /// use std::num::CheckedDiv;
+ /// assert_eq!((-127i8).checked_div(&-1), Some(127));
+ /// assert_eq!((-128i8).checked_div(&-1), None);
+ /// ```
fn checked_div(&self, v: &Self) -> Option<Self>;
}