From c2af326410fe2c20b20da131b672e4d09dcfdda8 Mon Sep 17 00:00:00 2001 From: Dalton Caron Date: Wed, 5 Feb 2020 23:28:20 -0700 Subject: [PATCH 1/4] Implemented Binary and Display traits for FixedBitSet. --- src/lib.rs | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 368eccf..1aa9808 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,7 +28,9 @@ use core as std; mod range; -use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Index}; +use std::fmt::Binary; +use std::fmt::{Display, Error, Formatter}; +use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Index, Add}; use std::cmp::{Ord, Ordering}; use std::iter::{Chain, FromIterator}; pub use range::IndexRange; @@ -356,6 +358,28 @@ impl FixedBitSet } } +impl Binary for FixedBitSet { + fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { + let mut display_data = if f.alternate() { + String::from("0b") + } else { + String::new() + }; + + for block in self.data.iter().rev() { + display_data = display_data.add(&format!("{:b}", block)); + }; + + write!(f, "{}", display_data) + } +} + +impl Display for FixedBitSet { + fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { + Binary::fmt(&self, f) + } +} + /// An iterator producing elements in the difference of two sets. /// /// This struct is created by the [`FixedBitSet::difference`] method. @@ -1373,3 +1397,24 @@ fn from_iterator_ones() { assert_eq!(fb.len(), dup.len()); assert_eq!(fb.ones().collect::>(), dup.ones().collect::>()); } + +#[test] +fn binary_trait() { + let items: Vec = vec![1, 5, 7, 10, 14, 15]; + let fb = items.iter().cloned().collect::(); + + assert_eq!(format!("{:b}", fb), "1100010010100010"); + assert_eq!(format!("{:#b}", fb), "0b1100010010100010"); +} + +#[test] +fn display_trait() { + let len = 8; + let mut fb = FixedBitSet::with_capacity(len); + + fb.put(4); + fb.put(2); + + assert_eq!(format!("{}", fb), "10100"); + assert_eq!(format!("{:#}", fb), "0b10100"); +} \ No newline at end of file From 923555c310266b68b44a3f85ab21e9a2338eb507 Mon Sep 17 00:00:00 2001 From: Dalton Caron Date: Wed, 5 Feb 2020 23:43:11 -0700 Subject: [PATCH 2/4] Only use Display and Binary with std. --- src/lib.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 1aa9808..7a413b3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,9 +28,11 @@ use core as std; mod range; -use std::fmt::Binary; -use std::fmt::{Display, Error, Formatter}; -use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Index, Add}; +#[cfg(feature = "std")] +use std::fmt::{Display, Error, Formatter, Binary}; +use std::ops::{Add}; + +use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Index}; use std::cmp::{Ord, Ordering}; use std::iter::{Chain, FromIterator}; pub use range::IndexRange; @@ -358,6 +360,7 @@ impl FixedBitSet } } +#[cfg(feature = "std")] impl Binary for FixedBitSet { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { let mut display_data = if f.alternate() { @@ -374,6 +377,7 @@ impl Binary for FixedBitSet { } } +#[cfg(feature = "std")] impl Display for FixedBitSet { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { Binary::fmt(&self, f) @@ -1398,6 +1402,7 @@ fn from_iterator_ones() { assert_eq!(fb.ones().collect::>(), dup.ones().collect::>()); } +#[cfg(feature = "std")] #[test] fn binary_trait() { let items: Vec = vec![1, 5, 7, 10, 14, 15]; @@ -1407,6 +1412,7 @@ fn binary_trait() { assert_eq!(format!("{:#b}", fb), "0b1100010010100010"); } +#[cfg(feature = "std")] #[test] fn display_trait() { let len = 8; From f2137e21d9e8781ea0c6c173f2626b995e2a212d Mon Sep 17 00:00:00 2001 From: Dalton Date: Wed, 15 Apr 2020 12:42:34 -0700 Subject: [PATCH 3/4] Remove String usage and build binary representation incrementally. --- src/lib.rs | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 7a413b3..525dd42 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,8 +29,8 @@ use core as std; mod range; #[cfg(feature = "std")] +use std::fmt::Write; use std::fmt::{Display, Error, Formatter, Binary}; -use std::ops::{Add}; use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Index}; use std::cmp::{Ord, Ordering}; @@ -363,17 +363,19 @@ impl FixedBitSet #[cfg(feature = "std")] impl Binary for FixedBitSet { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { - let mut display_data = if f.alternate() { - String::from("0b") - } else { - String::new() - }; + if f.alternate() { + f.write_str("0b")?; + } - for block in self.data.iter().rev() { - display_data = display_data.add(&format!("{:b}", block)); - }; + for i in 0..self.length { + if self[i] { + f.write_char('1')?; + } else { + f.write_char('0')?; + } + } - write!(f, "{}", display_data) + Ok(()) } } @@ -1408,8 +1410,8 @@ fn binary_trait() { let items: Vec = vec![1, 5, 7, 10, 14, 15]; let fb = items.iter().cloned().collect::(); - assert_eq!(format!("{:b}", fb), "1100010010100010"); - assert_eq!(format!("{:#b}", fb), "0b1100010010100010"); + assert_eq!(format!("{:b}", fb), "0100010100100011"); + assert_eq!(format!("{:#b}", fb), "0b0100010100100011"); } #[cfg(feature = "std")] @@ -1421,6 +1423,6 @@ fn display_trait() { fb.put(4); fb.put(2); - assert_eq!(format!("{}", fb), "10100"); - assert_eq!(format!("{:#}", fb), "0b10100"); + assert_eq!(format!("{}", fb), "00101000"); + assert_eq!(format!("{:#}", fb), "0b00101000"); } \ No newline at end of file From e3787d1a17c75246f1ec3e36f040b853e48fd589 Mon Sep 17 00:00:00 2001 From: Dalton Date: Wed, 15 Apr 2020 13:19:47 -0700 Subject: [PATCH 4/4] Remove std labels that are no needed. --- src/lib.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 525dd42..b4d29d1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,7 +28,6 @@ use core as std; mod range; -#[cfg(feature = "std")] use std::fmt::Write; use std::fmt::{Display, Error, Formatter, Binary}; @@ -360,7 +359,6 @@ impl FixedBitSet } } -#[cfg(feature = "std")] impl Binary for FixedBitSet { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { if f.alternate() { @@ -379,7 +377,6 @@ impl Binary for FixedBitSet { } } -#[cfg(feature = "std")] impl Display for FixedBitSet { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { Binary::fmt(&self, f)