use std::num::NonZero;
use std::sync::Arc;
use crate::{EfficiencyClass, MemoryRegionId, ProcessorId, RelativeSpeed};
#[derive(Clone, Debug)]
pub struct ProcessorBuilder {
pub(crate) explicit_id: Option<ProcessorId>,
pub(crate) memory_region_id: MemoryRegionId,
pub(crate) efficiency_class: EfficiencyClass,
pub(crate) relative_speed: RelativeSpeed,
pub(crate) model: Option<Arc<str>>,
}
impl Default for ProcessorBuilder {
fn default() -> Self {
Self::new()
}
}
impl ProcessorBuilder {
#[must_use]
pub fn new() -> Self {
Self {
explicit_id: None,
memory_region_id: 0,
efficiency_class: EfficiencyClass::Performance,
relative_speed: RelativeSpeed::from_raw(1),
model: None,
}
}
#[must_use]
pub fn id(mut self, id: ProcessorId) -> Self {
self.explicit_id = Some(id);
self
}
#[must_use]
pub fn memory_region(mut self, memory_region_id: MemoryRegionId) -> Self {
self.memory_region_id = memory_region_id;
self
}
#[must_use]
pub fn efficiency_class(mut self, efficiency_class: EfficiencyClass) -> Self {
self.efficiency_class = efficiency_class;
self
}
#[must_use]
pub fn relative_speed(mut self, relative_speed: NonZero<u64>) -> Self {
self.relative_speed = RelativeSpeed::from_raw(relative_speed.get());
self
}
#[must_use]
pub fn model(mut self, model: &str) -> Self {
self.model = Some(Arc::from(model));
self
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use std::panic::{RefUnwindSafe, UnwindSafe};
use new_zealand::nz;
use static_assertions::assert_impl_all;
use super::*;
assert_impl_all!(ProcessorBuilder: UnwindSafe, RefUnwindSafe);
#[test]
fn default_equals_new() {
let default_builder = ProcessorBuilder::default();
let new_builder = ProcessorBuilder::new();
assert_eq!(default_builder.explicit_id, new_builder.explicit_id);
assert_eq!(
default_builder.memory_region_id,
new_builder.memory_region_id
);
assert_eq!(
default_builder.efficiency_class,
new_builder.efficiency_class
);
assert_eq!(default_builder.relative_speed, new_builder.relative_speed);
assert_eq!(default_builder.model, new_builder.model);
}
#[test]
fn default_values() {
let builder = ProcessorBuilder::new();
assert_eq!(builder.explicit_id, None);
assert_eq!(builder.memory_region_id, 0);
assert_eq!(builder.efficiency_class, EfficiencyClass::Performance);
assert_eq!(builder.relative_speed, RelativeSpeed::from_raw(1));
assert_eq!(builder.model, None);
}
#[test]
fn explicit_id() {
let builder = ProcessorBuilder::new().id(5);
assert_eq!(builder.explicit_id, Some(5));
}
#[test]
fn relative_speed_is_respected() {
let builder = ProcessorBuilder::new().relative_speed(nz!(3600));
assert_eq!(builder.relative_speed.as_u64(), 3600);
}
#[test]
fn model_is_respected() {
let builder = ProcessorBuilder::new().model("Example Model");
assert_eq!(builder.model.as_deref(), Some("Example Model"));
}
#[test]
fn builder_chaining() {
let builder = ProcessorBuilder::new()
.id(3)
.memory_region(2)
.efficiency_class(EfficiencyClass::Efficiency)
.relative_speed(nz!(2400))
.model("Chained Model");
assert_eq!(builder.explicit_id, Some(3));
assert_eq!(builder.memory_region_id, 2);
assert_eq!(builder.efficiency_class, EfficiencyClass::Efficiency);
assert_eq!(builder.relative_speed.as_u64(), 2400);
assert_eq!(builder.model.as_deref(), Some("Chained Model"));
}
}