use crate::types::*;
#[derive(Clone, Debug, Default)]
pub struct StageManager {
luby_iter: LubySegment,
end_of_span: usize,
envelope_hight: usize,
envelope_starting_segment: usize,
next_is_new_envelope: bool,
}
impl StageManager {
pub fn new() -> Self {
StageManager {
luby_iter: LubySegment::default(),
envelope_hight: 1,
end_of_span: 1,
next_is_new_envelope: false,
envelope_starting_segment: 1,
}
}
pub fn initialize(&mut self) {
self.envelope_hight = 1;
self.end_of_span = 1;
self.next_is_new_envelope = true;
}
pub fn reset(&mut self) {
self.luby_iter.reset();
self.envelope_hight = 1;
self.end_of_span = 1;
self.next_is_new_envelope = true;
}
pub fn prepare_new_span(&mut self, now: usize) -> Option<bool> {
let mut new_segment = false;
let mut new_envelope = false;
self.luby_iter.shift();
if self.luby_iter.segment_len() == 1 {
self.envelope_starting_segment = self.luby_iter.seg_index as usize;
new_segment = true;
if self.next_is_new_envelope {
self.envelope_hight += 1;
self.next_is_new_envelope = false;
new_envelope = true;
}
}
if self.envelope_hight == self.luby_iter.segment_len() as usize {
self.next_is_new_envelope = true;
}
self.end_of_span = now
.checked_add(self.current_span())
.expect("overflow at L57");
new_segment.then_some(new_envelope)
}
pub fn span_ended(&self, now: usize) -> bool {
self.end_of_span <= now
}
pub fn extend(&mut self, add: usize) {
self.end_of_span += add;
}
pub fn current_span(&self) -> usize {
self.luby_iter.luby() as usize
}
pub fn current_segment(&self) -> usize {
self.luby_iter.seg_index as usize
}
pub fn envelop_index(&self) -> usize {
self.envelope_hight
}
pub fn current_segment_length(&self) -> usize {
self.luby_iter.segment_len() as usize
}
pub fn num_reducible(&self, reducing_factor: f64) -> usize {
let span = self.current_span();
let keep = (span as f64).powf(1.0 - reducing_factor) as usize;
span.saturating_sub(keep)
}
pub fn max_scale(&self) -> usize {
self.envelope_hight
}
pub fn envelope_starting_segment(&self) -> usize {
self.envelope_starting_segment
}
pub fn sequence_index(&self) -> usize {
self.luby_iter.sequence_index
}
}