2022-05-12 14:41:08 +02:00
|
|
|
#[derive(Debug)]
|
|
|
|
|
pub struct Directory<'a> {
|
|
|
|
|
pub name: &'a str,
|
|
|
|
|
pub size: i16,
|
|
|
|
|
pub scale: i16,
|
|
|
|
|
pub type_: DirectoryType,
|
|
|
|
|
pub maxsize: i16,
|
|
|
|
|
pub minsize: i16,
|
|
|
|
|
pub threshold: i16,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Directory<'_> {
|
2025-12-01 21:26:56 +01:00
|
|
|
pub fn directory_size_distance(&self, size: i16, scale: i16) -> i16 {
|
2022-05-12 14:41:08 +02:00
|
|
|
match self.type_ {
|
2025-12-01 21:26:56 +01:00
|
|
|
DirectoryType::Fixed => self.size * self.scale - size * scale,
|
|
|
|
|
|
2022-05-12 14:41:08 +02:00
|
|
|
DirectoryType::Scalable => {
|
2025-12-01 21:26:56 +01:00
|
|
|
let scaled_requested_size = size * scale;
|
2025-11-25 06:24:34 +01:00
|
|
|
let min_scaled_size = self.minsize * self.scale;
|
2022-05-12 14:41:08 +02:00
|
|
|
if scaled_requested_size < min_scaled_size {
|
|
|
|
|
min_scaled_size - scaled_requested_size
|
|
|
|
|
} else {
|
2025-11-25 06:24:34 +01:00
|
|
|
let max_scaled_size = self.maxsize * self.scale;
|
|
|
|
|
if scaled_requested_size < max_scaled_size {
|
|
|
|
|
scaled_requested_size - max_scaled_size
|
|
|
|
|
} else {
|
|
|
|
|
0
|
|
|
|
|
}
|
2022-05-12 14:41:08 +02:00
|
|
|
}
|
|
|
|
|
}
|
2025-12-01 21:26:56 +01:00
|
|
|
|
2022-05-12 14:41:08 +02:00
|
|
|
DirectoryType::Threshold => {
|
2025-12-01 21:26:56 +01:00
|
|
|
let scaled_requested_size = size * scale;
|
2022-05-12 14:41:08 +02:00
|
|
|
if scaled_requested_size < (self.size - self.threshold) * scale {
|
2025-11-25 06:24:34 +01:00
|
|
|
self.minsize * self.scale - scaled_requested_size
|
2022-05-12 14:41:08 +02:00
|
|
|
} else if scaled_requested_size > (self.size + self.threshold) * scale {
|
2025-11-25 06:24:34 +01:00
|
|
|
scaled_requested_size - self.maxsize * self.scale
|
2022-05-12 14:41:08 +02:00
|
|
|
} else {
|
|
|
|
|
0
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
|
pub enum DirectoryType {
|
|
|
|
|
Fixed,
|
|
|
|
|
Scalable,
|
|
|
|
|
Threshold,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Default for DirectoryType {
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
Self::Threshold
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-01 15:19:01 +01:00
|
|
|
impl From<&[u8]> for DirectoryType {
|
|
|
|
|
fn from(value: &[u8]) -> Self {
|
|
|
|
|
match value[0] {
|
2025-11-25 06:24:34 +01:00
|
|
|
b'F' => DirectoryType::Fixed,
|
|
|
|
|
b'S' => DirectoryType::Scalable,
|
2022-05-12 14:41:08 +02:00
|
|
|
_ => DirectoryType::Threshold,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|