#![allow(dead_code)]
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub struct MaskExportConfig {
pub name: String,
pub invert: bool,
}
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub struct MaskExport {
pub config: MaskExportConfig,
pub mask: Vec<bool>,
}
#[allow(dead_code)]
pub fn default_mask_export_config() -> MaskExportConfig {
MaskExportConfig {
name: "SelectionMask".to_string(),
invert: false,
}
}
#[allow(dead_code)]
pub fn new_mask_export(config: MaskExportConfig, vertex_count: usize) -> MaskExport {
MaskExport { config, mask: vec![false; vertex_count] }
}
#[allow(dead_code)]
pub fn mask_set(export: &mut MaskExport, index: usize, value: bool) {
if index < export.mask.len() {
export.mask[index] = value;
}
}
#[allow(dead_code)]
pub fn mask_get(export: &MaskExport, index: usize) -> bool {
export.mask.get(index).copied().unwrap_or(false)
}
#[allow(dead_code)]
pub fn mask_count_set(export: &MaskExport) -> usize {
export.mask.iter().filter(|&&v| v).count()
}
#[allow(dead_code)]
pub fn mask_count_clear(export: &MaskExport) -> usize {
export.mask.iter().filter(|&&v| !v).count()
}
#[allow(dead_code)]
pub fn mask_invert(export: &mut MaskExport) {
for v in &mut export.mask {
*v = !*v;
}
}
#[allow(dead_code)]
pub fn mask_to_bytes(export: &MaskExport) -> Vec<u8> {
let n_bytes = export.mask.len().div_ceil(8);
let mut bytes = vec![0u8; n_bytes];
for (i, &val) in export.mask.iter().enumerate() {
if val {
bytes[i / 8] |= 1 << (i % 8);
}
}
bytes
}
#[allow(dead_code)]
pub fn mask_to_json(export: &MaskExport) -> String {
format!(
"{{\"name\":\"{}\",\"vertex_count\":{},\"set_count\":{}}}",
export.config.name,
export.mask.len(),
mask_count_set(export)
)
}
#[allow(dead_code)]
pub fn mask_validate(export: &MaskExport) -> bool {
!export.mask.is_empty()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let cfg = default_mask_export_config();
assert_eq!(cfg.name, "SelectionMask");
assert!(!cfg.invert);
}
#[test]
fn test_new_mask_all_false() {
let export = new_mask_export(default_mask_export_config(), 8);
assert_eq!(mask_count_set(&export), 0);
assert_eq!(mask_count_clear(&export), 8);
}
#[test]
fn test_set_and_get() {
let mut export = new_mask_export(default_mask_export_config(), 4);
mask_set(&mut export, 2, true);
assert!(mask_get(&export, 2));
assert!(!mask_get(&export, 0));
}
#[test]
fn test_count_set() {
let mut export = new_mask_export(default_mask_export_config(), 4);
mask_set(&mut export, 0, true);
mask_set(&mut export, 3, true);
assert_eq!(mask_count_set(&export), 2);
}
#[test]
fn test_invert() {
let mut export = new_mask_export(default_mask_export_config(), 4);
mask_set(&mut export, 0, true);
mask_invert(&mut export);
assert!(!mask_get(&export, 0));
assert!(mask_get(&export, 1));
}
#[test]
fn test_to_bytes() {
let mut export = new_mask_export(default_mask_export_config(), 8);
mask_set(&mut export, 0, true);
let bytes = mask_to_bytes(&export);
assert_eq!(bytes[0] & 1, 1);
}
#[test]
fn test_to_json() {
let export = new_mask_export(default_mask_export_config(), 5);
let json = mask_to_json(&export);
assert!(json.contains("vertex_count"));
}
#[test]
fn test_validate_nonempty() {
let export = new_mask_export(default_mask_export_config(), 3);
assert!(mask_validate(&export));
}
#[test]
fn test_validate_empty() {
let export = new_mask_export(default_mask_export_config(), 0);
assert!(!mask_validate(&export));
}
}