use bitvec::vec::BitVec;
use crate::tree::datastore::K2Tree;
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct StemBit {
pub value: bool,
pub layer: usize,
pub stem: usize,
pub bit: usize,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct LeafBit {
pub value: bool,
pub x: usize,
pub y: usize,
pub leaf: usize,
pub bit: usize,
}
#[derive(Debug)]
pub struct Stems<'a> {
tree: &'a K2Tree,
pos: usize,
layer: usize,
stem: usize,
bit: usize,
}
impl<'a> Iterator for Stems<'a> {
type Item = StemBit;
fn next(&mut self) -> Option<Self::Item> {
let stem_len = self.tree.stem_len();
if self.pos >= self.tree.stems.len() {
return None
}
let ret_v = Some(StemBit {
value: self.tree.stems[self.pos],
layer: self.layer,
stem: self.stem,
bit: self.bit,
});
self.pos += 1;
if self.bit == stem_len-1 {
self.bit = 0;
if self.stem == (self.tree.layer_len(self.layer) / stem_len) - 1 {
self.stem = 0;
self.layer += 1;
}
else {
self.stem += 1;
}
}
else {
self.bit += 1;
}
ret_v
}
}
impl<'a> Stems<'a> {
pub fn new(tree: &'a K2Tree) -> Self {
Self {
tree,
pos: 0,
layer: 0,
stem: 0,
bit: 0,
}
}
}
#[derive(Debug)]
pub struct IntoStems {
tree: K2Tree,
pos: usize,
layer: usize,
stem: usize,
bit: usize,
}
impl Iterator for IntoStems {
type Item = StemBit;
fn next(&mut self) -> Option<Self::Item> {
let stem_len = self.tree.stem_len();
if self.pos >= self.tree.stems.len() {
return None
}
let ret_v = Some(StemBit {
value: self.tree.stems[self.pos],
layer: self.layer,
stem: self.stem,
bit: self.bit,
});
self.pos += 1;
if self.bit == stem_len-1 {
self.bit = 0;
if self.stem == (self.tree.layer_len(self.layer) / stem_len) - 1 {
self.stem = 0;
self.layer += 1;
}
else {
self.stem += 1;
}
}
else {
self.bit += 1;
}
ret_v
}
}
impl IntoStems {
pub fn new(tree: K2Tree) -> Self {
Self {
tree,
pos: 0,
layer: 0,
stem: 0,
bit: 0,
}
}
}
#[derive(Debug)]
pub struct Leaves<'a> {
tree: &'a K2Tree,
pos: usize,
}
impl<'a> Iterator for Leaves<'a> {
type Item = LeafBit;
fn next(&mut self) -> Option<Self::Item> {
if self.pos == self.tree.leaves.len() { return None }
let [x, y] = self.tree.get_coords(self.pos);
let value = self.tree.leaves[self.pos];
let leaf = self.pos / self.tree.leaf_len();
let bit = self.pos % self.tree.leaf_len();
self.pos += 1;
Some(LeafBit {
value,
x,
y,
leaf,
bit
})
}
}
impl<'a> Leaves<'a> {
pub fn new(tree: &'a K2Tree) -> Self {
Self {
tree,
pos: 0,
}
}
}
#[derive(Debug)]
pub struct IntoLeaves {
tree: K2Tree,
pos: usize,
}
impl Iterator for IntoLeaves {
type Item = LeafBit;
fn next(&mut self) -> Option<Self::Item> {
if self.pos == self.tree.leaves.len() { return None }
let leaf_len = self.tree.leaf_len();
let [x, y] = self.tree.get_coords(self.pos);
let value = self.tree.leaves[self.pos];
let leaf = self.pos / leaf_len;
let bit = self.pos % leaf_len;
self.pos += 1;
Some(LeafBit {
value,
x,
y,
leaf,
bit
})
}
}
impl IntoLeaves {
pub fn new(tree: K2Tree) -> Self {
Self {
tree,
pos: 0,
}
}
}
#[derive(Debug)]
pub struct StemsRaw<'a> {
stems: &'a BitVec,
pos: usize,
}
impl<'a> Iterator for StemsRaw<'a> {
type Item = bool;
fn next(&mut self) -> Option<Self::Item> {
if self.pos >= self.stems.len() {
return None
}
let ret_v = Some(self.stems[self.pos]);
self.pos += 1;
ret_v
}
}
impl<'a> StemsRaw<'a> {
pub fn new(tree: &'a K2Tree) -> Self {
Self {
stems: &tree.stems,
pos: 0,
}
}
}
#[derive(Debug)]
pub struct LeavesRaw<'a> {
leaves: &'a BitVec,
pos: usize,
}
impl<'a> Iterator for LeavesRaw<'a> {
type Item = bool;
fn next(&mut self) -> Option<Self::Item> {
if self.pos >= self.leaves.len() {
return None
}
let ret_v = Some(self.leaves[self.pos]);
self.pos += 1;
ret_v
}
}
impl<'a> LeavesRaw<'a> {
pub fn new(tree: &'a K2Tree) -> Self {
Self {
leaves: &tree.leaves,
pos: 0,
}
}
}