1use std::fmt::Display;
2use std::num::ParseIntError;
3use std::ops::{AddAssign, DivAssign, Not, Shr};
4use std::str::FromStr;
5
6use num_traits::{CheckedNeg, CheckedRem, ConstOne, ConstZero, One, PrimInt, WrappingAdd};
7
8use crate::cheats::Cheats;
9use crate::full_mul_div::FullMulDiv;
10
11pub trait ScaledInteger<const D: u8>:
12 PrimInt
13 + ConstZero
14 + ConstOne
15 + One
16 + WrappingAdd<Output = Self>
17 + CheckedRem<Output = Self>
18 + Not<Output = Self>
19 + Shr<u32, Output = Self>
20 + AddAssign
21 + DivAssign
22 + Display
23 + FromStr<Err = ParseIntError>
24 + Cheats<D>
25 + FullMulDiv
26{
27}
28
29impl<I, const D: u8> ScaledInteger<D> for I where
30 I: PrimInt
31 + ConstZero
32 + ConstOne
33 + One
34 + WrappingAdd<Output = Self>
35 + CheckedRem<Output = Self>
36 + Not<Output = Self>
37 + Shr<u32, Output = Self>
38 + AddAssign
39 + DivAssign
40 + Display
41 + FromStr<Err = ParseIntError>
42 + Cheats<D>
43 + FullMulDiv
44{
45}
46
47pub trait SignedScaledInteger<const D: u8>: ScaledInteger<D> + CheckedNeg {}
48
49impl<I, const D: u8> SignedScaledInteger<D> for I where I: ScaledInteger<D> + CheckedNeg {}