use crate::{common::BitArray, oned::rss::DataCharacterTrait};
use super::ExpandedPair;
pub fn buildBitArray(pairs: &Vec<ExpandedPair>) -> Option<BitArray> {
let mut charNumber = (pairs.len() * 2) - 1;
if let Some(pair) = pairs.last() {
if pair.getRightChar().is_none() {
charNumber -= 1;
}
}
let size = 12 * charNumber;
let mut binary = BitArray::with_size(size);
let mut accPos = 0;
let firstPair = pairs.get(0)?;
let rp = firstPair.getRightChar().as_ref()?;
let firstValue = rp.getValue();
let mut i = 11;
while i >= 0 {
if (firstValue & (1 << i)) != 0 {
binary.set(accPos);
}
accPos += 1;
i -= 1;
}
for i in 1..pairs.len() {
let currentPair = pairs.get(i)?;
let lv = currentPair.getLeftChar().as_ref()?;
let leftValue = lv.getValue();
let mut j = 11;
while j >= 0 {
if (leftValue & (1 << j)) != 0 {
binary.set(accPos);
}
accPos += 1;
j -= 1;
}
if let Some(rc) = currentPair.getRightChar() {
let rightValue = rc.getValue(); let mut j = 11;
while j >= 0 {
if (rightValue & (1 << j)) != 0 {
binary.set(accPos);
}
accPos += 1;
j -= 1;
}
}
}
Some(binary)
}
#[cfg(test)]
mod BitArrayBuilderTest {
use crate::{
common::BitArray,
oned::rss::{expanded::ExpandedPair, DataCharacter},
};
#[test]
fn testBuildBitArray1() {
let pairValues = vec![vec![19], vec![673, 16]];
let expected = " .......X ..XX..X. X.X....X .......X ....";
checkBinary(&pairValues, expected);
}
fn checkBinary(pairValues: &[Vec<u32>], expected: &str) {
let binary = buildBitArray(pairValues);
assert_eq!(expected, binary.to_string());
}
fn buildBitArray(pairValues: &[Vec<u32>]) -> BitArray {
let mut pairs = Vec::new(); for (i, pair) in pairValues.iter().enumerate() {
let leftChar = if i == 0 {
None
} else {
Some(DataCharacter::new(pair[0], 0))
};
let rightChar = if i == 0 {
Some(DataCharacter::new(pair[0], 0))
} else if pair.len() == 2 {
Some(DataCharacter::new(pair[1], 0))
} else {
None
};
let expandedPair = ExpandedPair::new(leftChar, rightChar, None);
pairs.push(expandedPair);
}
super::buildBitArray(&pairs).unwrap()
}
}