pub trait TypedMul<N: IsInteger> {
type Output: IsInteger;
type Overflow: IsInteger;
}
Expand description
A multiplication of 32 bit number and 32 bit number can be stored safely in a 64 bit number. We represent them as lower 32 bits and upper 32 bits
Example
use const_arithmetic::*;
let a = parse_integer!(6);
let b = parse_integer!(4);
let c = parse_integer!(24);
// This verifies that 6 * 4 = 24
fn example<P, Q, R>(_p: P, _q: Q, _r: R) where
P: IsInteger,
Q: IsInteger,
R: IsInteger,
P: TypedMul<Q, Output = R>
{}
example(a, b, c);
// If we are handling really big integers we can get the overflowed bits as follows
// 1234567890 * 987654321 = 1219326311126352690 = 283896529 * (2**32) + 3623437106
let a = parse_integer!(1234567890);
let b = parse_integer!(987654321);
let overflow = parse_integer!(283896529);
let result = parse_integer!(3623437106);
// This verifies that 7 - 4 = 3
fn example2<P, Q, R, S>(_p: P, _q: Q, _r: R, _s: S) where
P: IsInteger,
Q: IsInteger,
R: IsInteger,
S: IsInteger,
P: TypedMul<Q, Output = R, Overflow = S>
{}
example2(a, b, result, overflow);