use crate::time;
use core::alloc::Layout;
use core::time::Duration;
#[derive(Clone)]
#[repr(C)]
pub struct Attr {
pub(crate) group_id: u8,
pub(crate) priority: u8,
pub(crate) fdset: u16,
pub(crate) delay: bool,
pub(crate) hash: usize,
pub(crate) timeout: Duration,
pub(crate) max_cache: usize,
pub(crate) tail: Layout,
}
impl Default for Attr {
fn default() -> Self {
Self::new()
}
}
impl Attr {
pub const fn new() -> Self {
Self {
group_id: 0,
priority: 0,
fdset: 32,
timeout: Duration::MAX,
delay: false,
hash: 0,
max_cache: 0,
tail: Layout::new::<()>(),
}
}
pub fn id(&mut self, id: u8) -> &mut Self {
self.group_id = id;
self
}
pub fn priority(&mut self, priority: u8) -> &mut Self {
self.priority = priority;
self
}
pub fn fdset(&mut self, capacity: u16) -> &mut Self {
self.fdset = capacity;
self
}
pub fn hash(&mut self, hash: usize) -> &mut Self {
self.hash = hash;
self
}
pub fn deadline(&mut self, timeout: Duration) -> &mut Self {
self.timeout = timeout.saturating_add(time::now());
self
}
pub fn delay(&mut self, timeout: Duration) -> &mut Self {
self.delay = true;
self.timeout = timeout;
self
}
pub fn max_cache(&mut self, max_cache: usize) -> &mut Self {
self.max_cache = max_cache;
self
}
pub(crate) fn tail(&mut self, layout: Layout) -> &mut Self {
self.tail = layout;
self
}
}