1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
use crate::chopper::chopper::DataSink; use crate::error::{CliResult, Error}; pub type ChainId = usize; pub type PinId = usize; pub enum DataNode { DataSink(Box<dyn DataSink>), Merge(ChainId, PinId), Split(Vec<ChainId>) } pub struct DataChain { nodes: Vec<DataNode> } pub struct DataGraph { data_chains: Vec<DataChain>, } impl DataChain { pub fn new() -> Self { let nodes: Vec<DataNode> = Vec::new(); DataChain { nodes } } pub fn node(&mut self, node_id: usize) -> &mut DataNode { let node = self.nodes.get_mut(node_id).unwrap(); node } pub fn nodes(&mut self) -> &mut Vec<DataNode> { &mut self.nodes } } impl DataGraph { pub fn new(chain_len: usize) -> Self { let mut data_chains: Vec<DataChain> = Vec::with_capacity(chain_len); for _i in 0..chain_len { data_chains.push(DataChain::new()); } DataGraph { data_chains } } pub fn len(&self) -> usize { self.data_chains.len() } pub fn get_mut_chain(&mut self, chain_id: ChainId) -> &mut DataChain { self.data_chains.get_mut(chain_id).unwrap() } pub fn add_node(&mut self, node: DataNode, chain_id: ChainId) -> CliResult<()> { match self.data_chains.get_mut(chain_id) { Some(c) => c.nodes.push(node), None => return Err(Error::from( format!("DataGraph -- index out of bound. \ ChainId: [{}], DataGraph size: [{:?}]", chain_id, self.data_chains.len()))) }; Ok(()) } }