///////////////////// PRELUDE ///////////////////// pub(crate) use crate::protocol::{ComponentState, ProtocolDescription}; pub(crate) use crate::runtime::{NonsyncProtoContext, SyncProtoContext}; pub use core::{ cmp::Ordering, fmt::{Debug, Formatter}, hash::{Hash, Hasher}, ops::{Range, RangeFrom}, time::Duration, }; pub use indexmap::{IndexMap, IndexSet}; pub use maplit::{hashmap, hashset}; pub use mio::{ net::{TcpListener, TcpStream}, Events, Interest, Poll, Token, }; pub use std::{ collections::{hash_map::Entry, BTreeMap, HashMap, HashSet}, convert::TryInto, io::{Read, Write}, net::SocketAddr, sync::Arc, time::Instant, }; pub use Polarity::*; ///////////////////// DEFS ///////////////////// pub type ConnectorId = u32; pub type PortSuffix = u32; #[derive( Copy, Clone, Eq, PartialEq, Ord, Hash, PartialOrd, serde::Serialize, serde::Deserialize, )] #[repr(C)] pub struct Id { pub(crate) connector_id: ConnectorId, pub(crate) u32_suffix: PortSuffix, } #[derive(Debug, Default)] pub struct U32Stream { next: u32, } // globally unique #[derive( Copy, Clone, Eq, PartialEq, Ord, Hash, PartialOrd, serde::Serialize, serde::Deserialize, )] #[repr(transparent)] pub struct PortId(Id); #[derive( Copy, Clone, Eq, PartialEq, Ord, Hash, PartialOrd, serde::Serialize, serde::Deserialize, )] pub struct FiringVar(pub(crate) PortId); #[derive( Copy, Clone, Eq, PartialEq, Ord, Hash, PartialOrd, serde::Serialize, serde::Deserialize, )] pub struct ProtoComponentId(Id); #[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)] // #[repr(C)] pub struct Payload(Arc>); #[derive( Debug, Eq, PartialEq, Clone, Hash, Copy, Ord, PartialOrd, serde::Serialize, serde::Deserialize, )] #[repr(C)] pub enum Polarity { Putter, // output port (from the perspective of the component) Getter, // input port (from the perspective of the component) } #[derive( Debug, Eq, PartialEq, Clone, Hash, Copy, Ord, PartialOrd, serde::Serialize, serde::Deserialize, )] #[repr(C)] pub enum EndpointPolarity { Active, // calls connect() Passive, // calls bind() listen() accept() } #[derive(Eq, PartialEq, Copy, Clone, Debug)] pub enum AddComponentError { NoSuchComponent, NonPortTypeParameters, CannotMovePort(PortId), WrongNumberOfParamaters { expected: usize }, UnknownPort(PortId), WrongPortPolarity { port: PortId, expected_polarity: Polarity }, DuplicateMovedPort(PortId), } #[derive(Debug, Clone)] pub enum NonsyncBlocker { Inconsistent, ComponentExit, SyncBlockStart, } #[derive(Debug, Clone)] pub enum SyncBlocker { Inconsistent, SyncBlockEnd, CouldntReadMsg(PortId), CouldntCheckFiring(PortId), PutMsg(PortId, Payload), } ///////////////////// IMPL ///////////////////// impl U32Stream { pub fn next(&mut self) -> u32 { if self.next == u32::MAX { panic!("NO NEXT!") } self.next += 1; self.next - 1 } } impl From for PortId { fn from(id: Id) -> PortId { Self(id) } } impl From for ProtoComponentId { fn from(id: Id) -> ProtoComponentId { Self(id) } } impl From<&[u8]> for Payload { fn from(s: &[u8]) -> Payload { Payload(Arc::new(s.to_vec())) } } impl Payload { pub fn new(len: usize) -> Payload { let mut v = Vec::with_capacity(len); unsafe { v.set_len(len); } Payload(Arc::new(v)) } pub fn len(&self) -> usize { self.0.len() } pub fn as_slice(&self) -> &[u8] { &self.0 } pub fn as_mut_slice(&mut self) -> &mut [u8] { Arc::make_mut(&mut self.0) as _ } pub fn concat_with(&mut self, other: &Self) { let bytes = other.as_slice().iter().copied(); let me = Arc::make_mut(&mut self.0); me.extend(bytes); } } impl serde::Serialize for Payload { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { let inner: &Vec = &self.0; inner.serialize(serializer) } } impl<'de> serde::Deserialize<'de> for Payload { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { let inner: Vec = Vec::deserialize(deserializer)?; Ok(Self(Arc::new(inner))) } } impl std::iter::FromIterator for Payload { fn from_iter>(it: I) -> Self { Self(Arc::new(it.into_iter().collect())) } } impl From> for Payload { fn from(s: Vec) -> Self { Self(s.into()) } } impl Debug for PortId { fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { write!(f, "ptID({}'{})", self.0.connector_id, self.0.u32_suffix) } } impl Debug for FiringVar { fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { write!(f, "fvID({}'{})", (self.0).0.connector_id, (self.0).0.u32_suffix) } } impl Debug for ProtoComponentId { fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { write!(f, "pcID({}'{})", self.0.connector_id, self.0.u32_suffix) } } impl std::ops::Not for Polarity { type Output = Self; fn not(self) -> Self::Output { use Polarity::*; match self { Putter => Getter, Getter => Putter, } } }