use super::{AssignStorageSiteTrait, CircularAlgo, HasIngestCapacityTrait, SteadyAlgo};
use crate::_auxlib as aux;
#[allow(non_snake_case)]
pub fn has_ingest_capacity<Uint: aux::UnsignedTrait>(S: Uint, T: Uint) -> bool {
let _0: Uint = Uint::zero();
let _10: Uint = Uint::from_u32(10).unwrap();
let _11: Uint = Uint::from_u32(11).unwrap();
let _12: Uint = Uint::from_u32(12).unwrap();
if S < _12 || S % _12 != _0 {
return false;
}
let twelfth_S: Uint = S / _12;
let eleven_twelfth_S: Uint = _11 * twelfth_S;
let t_div_12: Uint = T / _12;
let t_mod_12: Uint = T % _12;
let adj_t_mod: Uint = if t_mod_12 < _11 { t_mod_12 } else { _10 };
let has_capacity_1st =
CircularAlgo::has_ingest_capacity(eleven_twelfth_S, t_div_12 * _11 + adj_t_mod);
let has_capacity_2nd = T < _11 || SteadyAlgo::has_ingest_capacity(twelfth_S, (T - _11) / _12);
has_capacity_1st && has_capacity_2nd
}
#[allow(non_snake_case)]
pub fn _assign_storage_site<Uint: aux::UnsignedTrait>(S: Uint, T: Uint) -> Uint {
debug_assert!(has_ingest_capacity(S, T));
let _11: Uint = Uint::from_u32(11).unwrap();
let _12: Uint = Uint::from_u32(12).unwrap();
let twelfth_S: Uint = S / _12;
let eleven_twelfth_S: Uint = _11 * twelfth_S;
let remainder: Uint = T % _12;
if remainder < _11 {
let adj_T: Uint = (T / _12) * _11 + remainder;
let site: Uint = CircularAlgo::_assign_storage_site(eleven_twelfth_S, adj_T);
if site == eleven_twelfth_S {
S
} else {
site
}
} else {
let adj_T: Uint = T / _12;
let site: Uint = SteadyAlgo::_assign_storage_site(twelfth_S, adj_T);
if site == twelfth_S {
S
} else {
eleven_twelfth_S + site
}
}
}
#[allow(non_snake_case)]
pub fn assign_storage_site<Uint: aux::UnsignedTrait>(S: Uint, T: Uint) -> Option<Uint> {
let k: Uint = _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>(24, 5);
}
#[test]
fn test_smoke_assign_storage_site() {
assign_storage_site::<u32>(24, 5);
}
#[test]
fn test_smoke_impl_assign_storage_site() {
_assign_storage_site::<u32>(24, 5);
}
}