diff --git a/source/durandal/fixed.rs b/source/durandal/fixed.rs index 4ed6e8b..fab8a1f 100644 --- a/source/durandal/fixed.rs +++ b/source/durandal/fixed.rs @@ -67,7 +67,7 @@ macro_rules! define_fixed_types { $( $(#[$outer:meta])* struct $t:ident ( $ti:ident, $bytes:expr ) : - $tu:ident, $frac_bits:expr; $test:ident + $tu:ident, $tb:ident, $frac_bits:expr; $test:ident )* ) => {$( $(#[$outer])* @@ -109,6 +109,10 @@ macro_rules! define_fixed_types { #[inline] pub const fn fract(self) -> $t {$t(self.0 & $t::frac_mask_i())} + /// Returns the integer part of a number as an integer. + #[inline] + pub const fn integ(self) -> $ti {self.0 >> $t::frac_bits()} + /// Returns the number of ones in the bit representation of self. #[inline] pub const fn count_ones(self) -> u32 {self.0.count_ones()} @@ -218,13 +222,13 @@ macro_rules! define_fixed_types { #[inline] fn div_k(x: $ti, y: $ti) -> $ti { - (i64::from(x) * i64::from($t::one()) / i64::from(y)) as $ti + ($tb::from(x) * $tb::from($t::one()) / $tb::from(y)) as $ti } #[inline] fn mul_k(x: $ti, y: $ti) -> $ti { - (i64::from(x) * i64::from(y) / i64::from($t::one())) as $ti + ($tb::from(x) * $tb::from(y) / $tb::from($t::one())) as $ti } } @@ -423,17 +427,22 @@ define_fixed_types! { /// /// The format of this type is `0.9s`, but because of the implementation, /// the real format is `7.9s`. - struct Angle(i16, 2) : u16, 9; angle_tests + struct Angle(i16, 2) : u16, i32, 9; angle_tests /// A fixed point type representing a world unit. /// /// The format of this type is `5.10s`. This has caused eternal suffering. - struct Unit(i16, 2) : u16, 10; unit_tests + struct Unit(i16, 2) : u16, i32, 10; unit_tests /// A generic fixed point type. /// /// The format of this type is `15.16s`. - struct Fixed(i32, 4) : u32, 16; fixed_tests + struct Fixed(i32, 4) : u32, i64, 16; fixed_tests + + /// A generic, long fixed point type. + /// + /// The format of this type is `31.32s`. + struct FixedLong(i64, 8) : u64, i128, 32; fixed_long_tests } #[test]