1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use std::fmt::Display;
use std::num::ParseIntError;
use std::ops::{AddAssign, DivAssign, Not, Shr};
use std::str::FromStr;

use num_traits::{CheckedNeg, CheckedRem, ConstOne, ConstZero, One, PrimInt, WrappingAdd};

use crate::cheats::Cheats;
use crate::full_mul_div::FullMulDiv;

pub trait ScaledInteger<const D: u8>:
    PrimInt
    + ConstZero
    + ConstOne
    + One
    + WrappingAdd<Output = Self>
    + CheckedRem<Output = Self>
    + Not<Output = Self>
    + Shr<u32, Output = Self>
    + AddAssign
    + DivAssign
    + Display
    + FromStr<Err = ParseIntError>
    + Cheats<D>
    + FullMulDiv
{
}

impl<I, const D: u8> ScaledInteger<D> for I where
    I: PrimInt
        + ConstZero
        + ConstOne
        + One
        + WrappingAdd<Output = Self>
        + CheckedRem<Output = Self>
        + Not<Output = Self>
        + Shr<u32, Output = Self>
        + AddAssign
        + DivAssign
        + Display
        + FromStr<Err = ParseIntError>
        + Cheats<D>
        + FullMulDiv
{
}

pub trait SignedScaledInteger<const D: u8>: ScaledInteger<D> + CheckedNeg {}

impl<I, const D: u8> SignedScaledInteger<D> for I where I: ScaledInteger<D> + CheckedNeg {}