use std::cmp;
use std::fmt;
use std::hash;
-use std::iter::{Chain, Enumerate, Repeat, Skip, Take, repeat};
-use std::iter::{self, FromIterator};
+use std::iter::{self, Chain, Enumerate, FromIterator, Repeat, Skip, Take};
type MatchWords<'a, B> = Chain<Enumerate<Blocks<'a, B>>, Skip<Take<Enumerate<Repeat<B>>>>>;
// Take two BitVec's, and return iterators of their words, where the shorter one
// has been padded with 0's
-fn match_words<'a,'b, B: BitBlock>(a: &'a BitVec<B>, b: &'b BitVec<B>)
- -> (MatchWords<'a, B>, MatchWords<'b, B>) {
+fn match_words<'a, 'b, B: BitBlock>(a: &'a BitVec<B>, b: &'b BitVec<B>)
+ -> (MatchWords<'a, B>, MatchWords<'b, B>)
+{
let a_len = a.storage().len();
let b_len = b.storage().len();
}
}
-pub struct BitSet<B=u32> {
+pub struct BitSet<B = u32> {
bit_vec: BitVec<B>,
}
impl<B: BitBlock> Clone for BitSet<B> {
- fn clone(&self) -> Self {
- BitSet {
- bit_vec: self.bit_vec.clone(),
- }
- }
+ fn clone(&self) -> Self {
+ BitSet {
+ bit_vec: self.bit_vec.clone(),
+ }
+ }
+
+ fn clone_from(&mut self, other: &Self) {
+ self.bit_vec.clone_from(&other.bit_vec);
+ }
}
impl<B: BitBlock> Default for BitSet<B> {
}
impl<B: BitBlock> FromIterator<usize> for BitSet<B> {
- fn from_iter<I: IntoIterator<Item=usize>>(iter: I) -> Self {
- let mut ret: Self = Default::default();
+ fn from_iter<I: IntoIterator<Item = usize>>(iter: I) -> Self {
+ let mut ret = Self::default();
ret.extend(iter);
ret
}
impl<B: BitBlock> Extend<usize> for BitSet<B> {
#[inline]
- fn extend<I: IntoIterator<Item=usize>>(&mut self, iter: I) {
+ fn extend<I: IntoIterator<Item = usize>>(&mut self, iter: I) {
for i in iter {
self.insert(i);
}
impl<B: BitBlock> PartialOrd for BitSet<B> {
#[inline]
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
- Some(self.cmp(other))
+ self.iter().partial_cmp(other)
}
}
impl<B: BitBlock> Ord for BitSet<B> {
#[inline]
fn cmp(&self, other: &Self) -> Ordering {
- let mut a = self.iter();
- let mut b = other.iter();
- loop {
- match (a.next(), b.next()) {
- (Some(x), Some(y)) => match x.cmp(&y) {
- Ordering::Equal => {}
- otherwise => return otherwise,
- },
- (None, None) => return Ordering::Equal,
- (None, _) => return Ordering::Less,
- (_, None) => return Ordering::Greater,
- }
- }
+ self.iter().cmp(other)
}
}
-impl<B: BitBlock> cmp::PartialEq for BitSet<B> {
+impl<B: BitBlock> PartialEq for BitSet<B> {
#[inline]
fn eq(&self, other: &Self) -> bool {
- self.cmp(other) == Ordering::Equal
+ self.iter().eq(other)
}
}
-impl<B: BitBlock> cmp::Eq for BitSet<B> {}
+impl<B: BitBlock> Eq for BitSet<B> {}
impl BitSet<u32> {
/// Creates a new empty `BitSet`.
/// ```
#[inline]
pub fn new() -> Self {
- Default::default()
+ Self::default()
}
/// Creates a new `BitSet` with initially no contents, able to
#[inline]
pub fn with_capacity(nbits: usize) -> Self {
let bit_vec = BitVec::from_elem(nbits, false);
- BitSet::from_bit_vec(bit_vec)
+ Self::from_bit_vec(bit_vec)
}
/// Creates a new `BitSet` from the given bit vector.
}
}
-
/// Consumes this set to return the underlying bit vector.
///
/// # Examples
let old = self_bit_vec.storage()[i];
let new = f(old, w);
unsafe {
- self_bit_vec.storage_mut()[i] = new;
+ self_bit_vec.storage_mut()[i] = new;
}
}
}
// Truncate
let trunc_len = cmp::max(old_len - n, 1);
unsafe {
- bit_vec.storage_mut().truncate(trunc_len);
- bit_vec.set_len(trunc_len * B::bits());
+ bit_vec.storage_mut().truncate(trunc_len);
+ bit_vec.set_len(trunc_len * B::bits());
}
}
impl<B: BitBlock> fmt::Debug for BitSet<B> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
- try!(write!(fmt, "{{"));
- let mut first = true;
- for n in self {
- if !first {
- try!(write!(fmt, ", "));
- }
- try!(write!(fmt, "{:?}", n));
- first = false;
- }
- write!(fmt, "}}")
+ fmt.debug_set().entries(self).finish()
}
}
}
}
-
-
-
-
-
-
-
-
#[cfg(test)]
mod tests {
use std::cmp::Ordering::{Equal, Greater, Less};