crate::ix!();
pub type NetworkNodeIoChannelArray<NetworkItem> = [Option<Arc<AsyncRwLock<NetworkItem>>>; 4];
pub type NetworkNodeIoChannelValues<NetworkItem> = [Option<NetworkItem>; 4];
pub type NetworkNodeIoChannelReadGuardArray<'a,NetworkItem> = [Option<AsyncRwLockReadGuard<'a,NetworkItem>>; 4];
pub type NetworkNodeIoChannelWriteGuardArray<'a,NetworkItem> = [Option<AsyncRwLockWriteGuard<'a,NetworkItem>>; 4];
#[async_trait]
pub trait Operator<NetworkItem>: Debug + Named + Send + Sync
where NetworkItem: Debug + Send + Sync
{
fn opcode(&self) -> std::sync::Arc<dyn OpCode>;
fn input_count(&self) -> usize;
fn output_count(&self) -> usize;
fn input_port_type_str(&self, port: usize) -> Option<&'static str>;
fn output_port_type_str(&self, port: usize) -> Option<&'static str>;
fn input_port_connection_required(&self, port: usize) -> bool;
fn output_port_connection_required(&self, port: usize) -> bool;
async fn execute(
&self,
input: [Option<&NetworkItem>; 4],
output: &mut [Option<NetworkItem>; 4],
) -> NetResult<()>;
}
pub trait IntoArcOperator<NetworkItem> {
fn into_arc_operator(self) -> Arc<dyn Operator<NetworkItem>>;
}
impl<T,NetworkItem> IntoArcOperator<NetworkItem> for T
where
T: Operator<NetworkItem> + 'static,
NetworkItem: Debug + Send + Sync,
{
fn into_arc_operator(self) -> Arc<dyn Operator<NetworkItem>> {
Arc::new(self)
}
}
pub trait OperatorSignature {
type Input0;
type Input1;
type Input2;
type Input3;
type Output0;
type Output1;
type Output2;
type Output3;
}