use crate::{
common::{EmitIntensity, SamplingConfiguration},
error::AUTDInternalError,
};
pub trait ModulationProperty {
fn sampling_config(&self) -> SamplingConfiguration;
}
#[allow(clippy::len_without_is_empty)]
pub trait Modulation: ModulationProperty {
fn calc(&self) -> Result<Vec<EmitIntensity>, AUTDInternalError>;
fn len(&self) -> Result<usize, AUTDInternalError> {
self.calc().map(|v| v.len())
}
}
impl ModulationProperty for Box<dyn Modulation> {
#[cfg_attr(coverage_nightly, coverage(off))]
fn sampling_config(&self) -> SamplingConfiguration {
self.as_ref().sampling_config()
}
}
impl Modulation for Box<dyn Modulation> {
#[cfg_attr(coverage_nightly, coverage(off))]
fn calc(&self) -> Result<Vec<EmitIntensity>, AUTDInternalError> {
self.as_ref().calc()
}
#[cfg_attr(coverage_nightly, coverage(off))]
fn len(&self) -> Result<usize, AUTDInternalError> {
self.as_ref().len()
}
}
#[cfg(test)]
mod tests {
use super::*;
struct NullModulation {
pub buf: Vec<EmitIntensity>,
pub config: SamplingConfiguration,
}
impl ModulationProperty for NullModulation {
fn sampling_config(&self) -> SamplingConfiguration {
self.config
}
}
impl Modulation for NullModulation {
fn calc(&self) -> Result<Vec<EmitIntensity>, AUTDInternalError> {
Ok(self.buf.clone())
}
}
#[test]
fn test_modulation_property() {
let m = NullModulation {
config: SamplingConfiguration::from_frequency_division(512).unwrap(),
buf: vec![],
};
assert_eq!(m.sampling_config().frequency_division(), 512);
}
#[test]
fn test_modulation_len() {
assert_eq!(
NullModulation {
config: SamplingConfiguration::from_frequency_division(512).unwrap(),
buf: vec![],
}
.len()
.unwrap(),
0
);
assert_eq!(
NullModulation {
config: SamplingConfiguration::from_frequency_division(512).unwrap(),
buf: vec![EmitIntensity::new(0); 100],
}
.len()
.unwrap(),
100
);
}
}