traiter/numbers/
rem_euclid.rs

1pub trait RemEuclid<Divisor = Self> {
2    type Output;
3
4    /// Returns remainder of euclidean division.
5    /// ```
6    /// use traiter::numbers::RemEuclid;
7    /// // signed integers
8    /// assert_eq!(RemEuclid::rem_euclid(-3i8, 3i8), 0i8);
9    /// assert_eq!(RemEuclid::rem_euclid(-3i8, 2i8), 1i8);
10    /// assert_eq!(RemEuclid::rem_euclid(-3i8, 1i8), 0i8);
11    /// // unsigned integers
12    /// assert_eq!(RemEuclid::rem_euclid(3u8, 3u8), 0u8);
13    /// assert_eq!(RemEuclid::rem_euclid(3u8, 2u8), 1u8);
14    /// assert_eq!(RemEuclid::rem_euclid(3u8, 1u8), 0u8);
15    /// ```
16    fn rem_euclid(self, divisor: Divisor) -> Self::Output;
17}
18
19macro_rules! integer_rem_euclid_impl {
20    ($($integer:ty)*) => ($(
21        impl RemEuclid for $integer {
22            type Output = Self;
23
24            #[inline(always)]
25            fn rem_euclid(self, divisor: Self) -> Self::Output {
26                <$integer>::rem_euclid(self, divisor)
27            }
28        }
29    )*)
30}
31
32integer_rem_euclid_impl!(
33    i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize
34);