use crate::_auxlib as aux;
#[allow(non_snake_case)]
pub fn has_ingest_capacity<Uint: aux::UnsignedTrait>(S: Uint, T: Uint) -> bool {
_ = T;
(S.count_ones() == 1) && S > Uint::one()
}
#[allow(non_snake_case, clippy::just_underscores_and_digits)]
pub fn _assign_storage_site<Uint: aux::UnsignedTrait>(S: Uint, T: Uint) -> Uint {
debug_assert!(has_ingest_capacity(S, T));
let _0: Uint = Uint::zero();
let _1: Uint = Uint::one();
let s: Uint = aux::bit_length::<Uint>(S) - _1;
let blT: Uint = aux::bit_length::<Uint>(T);
let t: Uint = aux::floor_subtract::<Uint>(blT, s); let h: Uint = aux::ctz::<Uint>(T.wrapping_add(&_1));
let i: Uint = aux::overflow_shr::<Uint>(T, h + _1);
let j: Uint = aux::bit_floor::<Uint>(i).wrapping_sub(&_1);
let B: Uint = aux::bit_length::<Uint>(j); let mut k_b: Uint = aux::overflow_shl::<Uint>(_1, B).wrapping_mul(&(s + _1).wrapping_sub(&B));
let mut w: Uint = (h + s + _1).wrapping_sub(&blT); let mut o: Uint = w.wrapping_mul(&i.wrapping_sub(&j.wrapping_add(&_1)));
let is_zeroth_bunch = i == _0;
k_b = if !is_zeroth_bunch { k_b } else { _0 };
o = if !is_zeroth_bunch { o } else { _0 };
w = if !is_zeroth_bunch { w } else { s + _1 };
debug_assert!(w > _0 || h < t);
if h >= t {
k_b + o + (h % w)
} else {
S
}
}
#[allow(non_snake_case)]
pub fn assign_storage_site<Uint: aux::UnsignedTrait>(S: Uint, T: Uint) -> Option<Uint> {
let k = _assign_storage_site(S, T);
if k == S {
None
} else {
Some(k)
}
}
pub struct Algo;
#[allow(non_snake_case)]
impl crate::dstream::HasIngestCapacityTrait for Algo {
fn has_ingest_capacity<Uint: aux::UnsignedTrait>(S: Uint, T: Uint) -> bool {
has_ingest_capacity::<Uint>(S, T)
}
}
#[allow(non_snake_case)]
impl crate::dstream::AssignStorageSiteTrait for Algo {
fn _assign_storage_site<Uint: aux::UnsignedTrait>(S: Uint, T: Uint) -> Uint {
_assign_storage_site::<Uint>(S, T)
}
fn assign_storage_site<Uint: aux::UnsignedTrait>(S: Uint, T: Uint) -> Option<Uint> {
assign_storage_site::<Uint>(S, T)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_smoke_has_ingest_capacity() {
has_ingest_capacity::<u32>(16, 101);
}
#[test]
fn test_smoke_impl_assign_storage_site() {
_assign_storage_site::<u32>(16, 101);
}
#[test]
fn test_smoke_assign_storage_site() {
assign_storage_site::<u32>(16, 101);
}
}