yabf 0.3.0

yet another (deprecated) bit field
Documentation

crates.io Documentation Workflow Workflow dependency status license

This crate is deprecated

This crate can be replaced with vob if you add this trait to your code:

// u32 is slightly faster for random access w/o any bit operations
pub(crate) type VobU32 = vob::Vob<u32>;

pub(crate) trait GrowingVob {
    /// Will create a new Vob and fill it with `default`
    fn fill(initial_size: usize, default:bool) -> VobU32;
    /// Grow to fit new size, set ´bit´ to ´state´ value
    fn set_grow(&mut self, bit: usize, state: bool) -> bool;
    /// get() with default value `false`
    fn get_f(&self, bit: usize) -> bool;
}

impl GrowingVob for VobU32 {
    #[inline]
    fn fill(initial_size: usize, default:bool) -> Self {
        let mut v = Self::new_with_storage_type(0);
        v.resize(initial_size, default);
        v
    }

    #[inline]
    fn set_grow(&mut self, bit: usize, state: bool) -> bool {
        if bit >= self.len() {
            self.resize(bit + 64, false);
        }
        self.set(bit, state)
    }

    #[inline]
    fn get_f(&self, bit: usize) -> bool {
        self.get(bit).unwrap_or(false)
    }
}

Yabf

Just what the world needed - yet another bit field struct.

This is a small and simple implementation. It only has the basic functionality of a bit field:

  • Set arbitrary bit (if you set the millionth bit the list will use at least 125KB of heap space)
  • Get bit value
  • An iterator over the set bit indices. O(size of container)
  • The container never shrinks.

yabf::Yabf is a std::vec::Vec based bit field

let mut a = Yabf::default();
let mut b = Yabf::with_capacity(12345);
// bits are false by default
assert_eq!(a.bit(45), false);
a.set_bit(12345, true);
assert_eq!(a.bit(12345), true);
b.set_bit(345, true);
assert_eq!(b.bit(345), true);

yabf::SmallYabf is a smallvec::SmallVec based bit field. The struct will be entirely stack allocated if it contains less than 129 bits.

let mut a = SmallYabf::default();
let mut b = SmallYabf::with_capacity(12345);
a.set_bit(45, false);
b.set_bit(12345, true);
assert_eq!(a.bit(45), false);
assert_eq!(b.bit(12345), true);
assert_eq!(a.bit(12345), false);

Rust cargo

yabf::SmallYabf is enabled by default, disable like this:

yabf = {version="0.3",default-features=false}

yabf::SmallYabf is enabled by default

yabf = {version="0.3"}

License

Licensed under either of

at your option.