7个版本 (2个稳定版)
1.0.2 | 2024年8月10日 |
---|---|
1.0.0 | 2023年7月10日 |
0.1.4 | 2023年6月11日 |
0.1.3 | 2022年9月20日 |
#497 在 编码
每月143次下载
51KB
837 行
cj_bitmask_vec
BitmaskVec是一个将位掩码与T配对的vec。支持从u8到u128的位掩码。
可以添加带有或不带有位掩码的项目。如果没有提供位掩码,则默认为零。
使用位掩码进行过滤迭代
// filtering by bitmask
fn main() {
use cj_bitmask_vec::prelude::*;
let mut v = BitmaskVec::<u8, i32>::new();
// bitmasks hold whatever meaning the developer gives them.
// In this example any u8 is a valid bitmask.
// (bitmask) (T)
v.push_with_mask(0b00000000, 100);
v.push_with_mask(0b00000010, 101);
v.push_with_mask(0b00000011, 102);
v.push_with_mask(0b00000100, 103);
v.push_with_mask(0b00000110, 104);
v.push(105); // <- bitmask will default to zero
// or an easier way to add items
v += (0b00000000, 106);
v += (0b00010000, 107);
v += (0b00100000, 108);
v += (0b00000100, 109);
v += (0b10000001, 110);
v += (0b00000001, 111);
v += (0b00000000, 112);
v += 113; // <- bitmask will default to zero
assert_eq!(v[6], 106);
// here we're going to iterate all items that have bitmask bit 1 set
let mut count = 0;
let mut iter = v.iter_with_mask();
// (mask with bit 1 set)
// V
while let Some(pair) = iter.filter_mask(&0b00000010) {
// only T 101, 102 and 104 in the Vec above have
// bitmask bit one set.
assert!([101, 102, 104].contains(&pair.item));
count += 1;
}
assert_eq!(count, 3);
}
迭代T
fn main() {
use cj_bitmask_vec::prelude::*;
let mut v = BitmaskVec::<u8, i32>::new();
v.push_with_mask(0b00000000, 100);
v.push_with_mask(0b00000010, 101);
v.push_with_mask(0b00000010, 102);
v.push_with_mask(0b00000110, 103);
v.push_with_mask(0b00000001, 104);
v.push_with_mask(0b00000001, 105);
v.push_with_mask(0b00000000, 106);
let mut total = 0;
// iter excludes the bitmask
for x in v.iter() {
total += x;
}
assert_eq!(total, 721);
}
迭代T和位掩码。
fn main() {
use cj_bitmask_vec::prelude::*;
use cj_common::prelude::CjMatchesMask;
let mut v = BitmaskVec::<u8, i32>::new();
v.push_with_mask(0b00000000, 100);
v.push_with_mask(0b00000010, 101);
v.push_with_mask(0b00000010, 102);
v.push_with_mask(0b00000110, 103);
v.push_with_mask(0b00000001, 104);
v.push_with_mask(0b00000001, 105);
v.push_with_mask(0b00000000, 106);
let mut total = 0;
for x in v.iter_with_mask() {
if x.matches_mask(&0b00000010) {
total += x.item;
}
}
assert_eq!(total, 306);
}
可变迭代T
fn main() {
use cj_bitmask_vec::prelude::*;
let mut v = BitmaskVec::<u8, i32>::new();
v.push_with_mask(0b00000000, 100);
v.push_with_mask(0b00000010, 101);
v.push_with_mask(0b00000010, 102);
v.push_with_mask(0b00000100, 103);
v.push_with_mask(0b00000011, 104);
v.push_with_mask(0b00000001, 105);
v.push_with_mask(0b00000000, 106);
let mut total = 0;
// iter_mut exludes the bitmask
let x = v.iter_mut();
for z in x {
// here we modify T
total += *z;
*z *= 2;
}
// verify the changes from above
let mut total_2 = 0;
let x = v.iter();
for z in x {
total_2 += *z;
}
assert_eq!(total_2, total * 2);
}
可变迭代T和位掩码
fn main() {
use cj_bitmask_vec::prelude::*;
use cj_common::prelude::{Bitflag, CjMatchesMask};
let mut v = BitmaskVec::<u8, i32>::new();
v.push_with_mask(0b00000000, 100);
v.push_with_mask(0b00000010, 101);
v.push_with_mask(0b00000010, 102);
v.push_with_mask(0b00000100, 103);
v.push_with_mask(0b00000011, 104);
v.push_with_mask(0b00000001, 105);
v.push_with_mask(0b00000000, 106);
let mut total = 0;
let x = v.iter_with_mask_mut();
for z in x {
total += z.item;
// here we modify T
z.item *= 2;
// here we modify the 8th bit of the bitmask.
// - note that set_bit() only modifies a single bit,
// leaving the rest of bitmask unchanged.
z.bitmask.set_bit(7, true);
}
// verify the changes from above
let mut total_2 = 0;
let x = v.iter_with_mask();
for z in x {
total_2 += z.item;
// test that the 8th bit is now set.
assert!(z.matches_mask(&0b10000000));
}
// test that T was modified
assert_eq!(total_2, total * 2);
}
依赖项
~170KB