Initial commit.
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
/target/
|
||||||
|
|
||||||
|
Cargo.lock
|
||||||
14
.gitlab-ci.yml
Normal file
14
.gitlab-ci.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
image: "rust:latest"
|
||||||
|
|
||||||
|
variables:
|
||||||
|
CARGO_HOME: $CI_PROJECT_DIR/cargo
|
||||||
|
|
||||||
|
test:cargo:
|
||||||
|
script:
|
||||||
|
- rustc --version && cargo --version
|
||||||
|
- time cargo test --verbose --jobs 1 --release
|
||||||
|
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- target/
|
||||||
|
- cargo/
|
||||||
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "bit_set"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["logaritmisk <anders.e.olsson@gmail.com>"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
56
src/lib.rs
Normal file
56
src/lib.rs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
pub struct BitSet {
|
||||||
|
data: Box<[u64]>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BitSet {
|
||||||
|
pub fn with_capacity(max: usize) -> BitSet {
|
||||||
|
BitSet {
|
||||||
|
data: vec![0; max / 64 + if max % 64 == 0 { 0 } else { 1 }].into_boxed_slice()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn capacity(&self) -> u64 {
|
||||||
|
self.data.len() as u64 * 64
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn insert(&mut self, value: usize) {
|
||||||
|
let block = value / 64 as usize;
|
||||||
|
let bit = 2u64.pow((value - (block * 64)) as u32);
|
||||||
|
|
||||||
|
self.data[block] |= bit;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn remove(&mut self, value: usize) {
|
||||||
|
let block = value / 64 as usize;
|
||||||
|
let bit = 2u64.pow((value - (block * 64)) as u32);
|
||||||
|
|
||||||
|
self.data[block] &= !bit;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn contains(&self, value: usize) -> bool {
|
||||||
|
let block = value / 64 as usize;
|
||||||
|
let bit = 2u64.pow((value - (block * 64)) as u32);
|
||||||
|
|
||||||
|
self.data[block] & bit == bit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test() {
|
||||||
|
let mut set = BitSet::with_capacity(100);
|
||||||
|
|
||||||
|
assert_eq!(set.contains(0), false);
|
||||||
|
assert_eq!(set.contains(10), false);
|
||||||
|
|
||||||
|
set.insert(0);
|
||||||
|
set.insert(10);
|
||||||
|
|
||||||
|
assert_eq!(set.contains(0), true);
|
||||||
|
assert_eq!(set.contains(10), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user