use super::constructor::*;
use crate::data::NodeID;
use std::rc::Rc;
pub type OperatorId = usize;
#[derive(Debug, Clone, PartialEq, std::cmp::Eq, std::hash::Hash, Copy)]
pub struct GlobalNodeId {
pub operator_id: OperatorId,
pub node_id: NodeID,
}
#[allow(dead_code)]
impl GlobalNodeId {
pub fn null() -> GlobalNodeId {
GlobalNodeId {
operator_id: 0,
node_id: NodeID::new(0),
}
}
}
#[allow(dead_code)]
#[allow(clippy::upper_case_acronyms)]
#[derive(Default, Clone)]
pub struct DFG {
pub(crate) graph: Vec<DFGNode>,
}
impl DFG {
pub fn insert(&mut self, node: DFGNode) -> OperatorId {
let id = self.graph.len();
self.graph.push(node);
id
}
#[allow(dead_code)]
pub fn get(&self, id: &OperatorId) -> &DFGNode {
self.graph.get(*id).unwrap()
}
#[allow(dead_code)]
pub fn get_mut(&mut self, id: &OperatorId) -> &mut DFGNode {
self.graph.get_mut(*id).unwrap()
}
}
#[allow(dead_code)]
#[derive(Clone)]
pub struct DFGNode {
pub kind: DFGNodeKind,
operator_id: OperatorId,
paralellism: usize,
outgoing_channels: Vec<NodeID>,
ingoing: Vec<NodeID>,
channel_kind: ChannelKind,
}
impl DFGNode {
pub fn new(
kind: DFGNodeKind,
operator_id: OperatorId,
paralellism: usize,
ingoing: Vec<NodeID>,
) -> Self {
Self {
kind,
operator_id,
paralellism,
outgoing_channels: Vec::new(),
ingoing,
channel_kind: Default::default(),
}
}
pub fn get_input_channels(&self) -> &Vec<NodeID> {
&self.ingoing
}
pub fn get_node_ids(&self) -> Vec<NodeID> {
(0..self.paralellism)
.map(|i| NodeID::new(i as u32))
.collect()
}
pub fn set_outgoing_channels(&mut self, outgoing_channels: Vec<NodeID>) {
self.outgoing_channels = outgoing_channels;
}
#[allow(dead_code)]
pub fn get_channel_kind(&self) -> &ChannelKind {
&self.channel_kind
}
pub fn get_operator_id(&self) -> OperatorId {
self.operator_id
}
}
#[derive(Clone)]
pub enum DFGNodeKind {
Source(Rc<dyn SourceFactory>),
Node(Rc<dyn NodeFactory>),
Placeholder,
}
#[derive(Clone, Copy, Debug)]
pub enum ChannelKind {
Forward,
Broadcast,
RoundRobin,
Keyed,
Console,
Mute,
}
impl Default for ChannelKind {
fn default() -> Self {
ChannelKind::Forward
}
}