diff --git a/README.md b/README.md index 58ddfda..3963497 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,13 @@ fixed-point numbers. ## What’s new +### Version 0.1.1 (unreleased) + + * New static methods [`int_bits`] and [`frac_bits`] were added. + +[`frac_bits`]: https://docs.rs/fixed/0.1.0/fixed/struct.FixedI32.html#method.frac_bits +[`int_bits`]: https://docs.rs/fixed/0.1.0/fixed/struct.FixedI32.html#method.int_bits + ### Version 0.1.0 news (2018-08-10) * [`Unsigned`] constants provided by the [*typenum* crate] are now diff --git a/RELEASES.md b/RELEASES.md index 3cbe88a..b285bbf 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -5,6 +5,11 @@ modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty. --> +Version 0.1.1 (unreleased) +========================== + + * New static methods `int_bits` and `frac_bits` were added. + Version 0.1.0 (2018-08-10) ========================== diff --git a/src/display.rs b/src/display.rs index aeb3ef0..312156d 100644 --- a/src/display.rs +++ b/src/display.rs @@ -66,7 +66,8 @@ where R: Radix2, { let digit_bits: u32 = R::BITS.into(); - let (int_bits, frac_bits) = (F::int_bits(), F::frac_bits()); + let frac_bits = Frac::to_u32(); + let int_bits = F::bits() - frac_bits; let (is_neg, mut int, mut frac) = num.parts(); // 128 binary digits, one radix point, one leading zero let mut buf: [u8; 130] = [0; 130]; @@ -187,7 +188,8 @@ fn fmt_dec(num: F, fmt: &mut Formatter) -> FmtResult where F: FixedHelper, { - let (int_bits, frac_bits) = (F::int_bits(), F::frac_bits()); + let frac_bits = Frac::to_u32(); + let int_bits = F::bits() - frac_bits; let (is_neg, mut int, mut frac) = num.parts(); // 40 int digits // + 128 frac digits diff --git a/src/helper.rs b/src/helper.rs index ce1c287..0d93c40 100644 --- a/src/helper.rs +++ b/src/helper.rs @@ -31,14 +31,6 @@ pub(crate) trait FixedHelper: Sized { fn bits() -> u32 { mem::size_of::() as u32 * 8 } - #[inline(always)] - fn int_bits() -> u32 { - Self::bits() - Self::frac_bits() - } - #[inline(always)] - fn frac_bits() -> u32 { - Frac::to_u32() - } fn take_int_digit(int_part: &mut Self::Part, digit_bits: u32) -> u8; fn take_frac_digit(frac_part: &mut Self::Part, digit_bits: u32) -> u8; fn take_int_dec_digit(int_part: &mut Self::Part) -> u8; @@ -107,8 +99,8 @@ macro_rules! fixed_num_unsigned { #[inline] fn one() -> Option { - let int_bits = <$Fixed as FixedHelper>::int_bits(); - let frac_bits = <$Fixed as FixedHelper>::frac_bits(); + let int_bits = <$Fixed>::int_bits(); + let frac_bits = <$Fixed>::frac_bits(); if int_bits < 1 { None } else { @@ -124,8 +116,8 @@ macro_rules! fixed_num_unsigned { #[inline] fn parts(self) -> (bool, $Part, $Part) { let bits = self.to_bits(); - let int_bits = <$Fixed as FixedHelper>::int_bits(); - let frac_bits = <$Fixed as FixedHelper>::frac_bits(); + let int_bits = <$Fixed>::int_bits(); + let frac_bits = <$Fixed>::frac_bits(); let int_part = if int_bits == 0 { 0 } else { bits >> frac_bits }; let frac_part = if frac_bits == 0 { 0 } else { bits << int_bits }; (false, int_part, frac_part) @@ -141,8 +133,8 @@ macro_rules! fixed_num_signed { #[inline] fn one() -> Option { - let int_bits = <$Fixed as FixedHelper>::int_bits(); - let frac_bits = <$Fixed as FixedHelper>::frac_bits(); + let int_bits = <$Fixed>::int_bits(); + let frac_bits = <$Fixed>::frac_bits(); if int_bits < 2 { None } else { @@ -152,8 +144,8 @@ macro_rules! fixed_num_signed { #[inline] fn minus_one() -> Option { - let int_bits = <$Fixed as FixedHelper>::int_bits(); - let frac_bits = <$Fixed as FixedHelper>::frac_bits(); + let int_bits = <$Fixed>::int_bits(); + let frac_bits = <$Fixed>::frac_bits(); if int_bits < 1 { None } else { @@ -164,8 +156,8 @@ macro_rules! fixed_num_signed { #[inline] fn parts(self) -> (bool, $Part, $Part) { let bits = self.to_bits().wrapping_abs() as $Part; - let int_bits = <$Fixed as FixedHelper>::int_bits(); - let frac_bits = <$Fixed as FixedHelper>::frac_bits(); + let int_bits = <$Fixed>::int_bits(); + let frac_bits = <$Fixed>::frac_bits(); let int_part = if int_bits == 0 { 0 } else { bits >> frac_bits }; let frac_part = if frac_bits == 0 { 0 } else { bits << int_bits }; (self.to_bits() < 0, int_part,frac_part) diff --git a/src/lib.rs b/src/lib.rs index 2b83aa8..d317092 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -488,6 +488,19 @@ macro_rules! fixed { "Returns the largest value that can be represented.", $Fixed($Inner) => fn max_value() } + + /// Returns the number of integer bits. + #[inline] + pub fn int_bits() -> u32 { + <$Fixed as FixedHelper>::bits() - <$Fixed>::frac_bits() + } + + /// Returns the number of fractional bits. + #[inline] + pub fn frac_bits() -> u32 { + Frac::to_u32() + } + pass_method! { "Returns the number of ones in the binary representation.", $Fixed($Inner) => fn count_ones(self) -> u32