#![allow(missing_docs)]
use soma_som_core::quad::Quad;
use soma_som_core::types::{Layer, UnitId};
use crate::error::RingEngineError;
pub trait RingProcessor: Send {
fn process(
&mut self,
unit: UnitId,
cycle: u64,
input: &Quad,
data: &Quad,
) -> Result<Quad, RingEngineError>;
fn process_layer(
&mut self,
_unit: UnitId,
_cycle: u64,
_layer: Layer,
input: &Quad,
) -> Result<Quad, RingEngineError> {
Ok(input.clone())
}
fn externalize_state(&self, _unit: UnitId) -> Option<Quad> {
None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ring_processor_is_object_safe() {
fn _assert(_: &dyn RingProcessor) {}
}
struct EchoProcessor;
impl RingProcessor for EchoProcessor {
fn process(
&mut self,
_unit: UnitId,
_cycle: u64,
input: &Quad,
_data: &Quad,
) -> Result<Quad, RingEngineError> {
Ok(input.clone())
}
}
#[test]
fn echo_processor_vertical() {
let mut proc = EchoProcessor;
let input = Quad::default();
let output = proc
.process(UnitId::FU, 1, &input, &Quad::default())
.unwrap();
assert_eq!(output, input);
}
#[test]
fn default_process_layer_is_passthrough() {
let mut proc = EchoProcessor;
let input = Quad::default();
let output = proc
.process_layer(UnitId::FU, 1, Layer::Client, &input)
.unwrap();
assert_eq!(output, input);
}
#[test]
fn boxed_processor_works() {
let proc: Box<dyn RingProcessor> = Box::new(EchoProcessor);
assert_eq!(
std::mem::size_of_val(&proc),
std::mem::size_of::<Box<dyn RingProcessor>>()
);
}
}