use core::hash::Hash;
#[doc(hidden)]
pub trait ExternalNodeWrapper<T: Default + Copy>: NodeWrapper<Payload = T> {}
#[doc(hidden)]
pub trait ExternalConsumer: Copy + Hash {}
#[doc(hidden)]
pub trait ExternalProducer: Copy + Hash {}
pub trait Node<T: Default> {
type Consumer: Copy + Hash;
type Producer: Copy + Hash;
fn tick(&mut self) {}
#[allow(unused_variables)]
fn read(&self, producer: Self::Producer) -> T {
T::default()
}
#[allow(unused_variables)]
fn write(&mut self, consumer: Self::Consumer, input: T) {}
}
#[doc(hidden)]
pub trait NodeClass {
type Class: Hash + Copy + Eq;
fn class(&self) -> Self::Class;
}
pub trait NodeWrapper: NodeClass {
type Payload: Copy + Default;
type Consumer: Copy + Hash;
type Producer: Copy + Hash;
fn tick(&mut self) {}
#[allow(unused_variables)]
fn read<IntoP>(&self, producer: IntoP) -> Self::Payload
where
IntoP: Into<Self::Producer>,
{
Self::Payload::default()
}
#[allow(unused_variables)]
fn write<IntoC>(&mut self, consumer: IntoC, _input: Self::Payload)
where
IntoC: Into<Self::Consumer>,
{
}
}
pub trait NodeIndex: Copy + Hash + Eq {
#[doc(hidden)]
type Class: Copy + Hash + Eq;
#[doc(hidden)]
type Consumer: Copy + Hash + Eq;
type ConsumerIndex: ConsumerIndex<NodeIndex = Self, Consumer = Self::Consumer>;
#[doc(hidden)]
type Producer: Copy + Hash + Eq;
type ProducerIndex: ProducerIndex<NodeIndex = Self, Producer = Self::Producer>;
#[doc(hidden)]
fn new(class: Self::Class, index: usize) -> Self;
fn consumer<IntoC>(&self, consumer: IntoC) -> Self::ConsumerIndex
where
IntoC: Into<Self::Consumer>;
fn producer<IntoP>(&self, producer: IntoP) -> Self::ProducerIndex
where
IntoP: Into<Self::Producer>;
}
pub trait ConsumerIndex: Copy + Hash + Eq {
type NodeIndex: NodeIndex<Consumer = Self::Consumer>;
type Consumer: Copy + Hash + Eq;
#[doc(hidden)]
fn new(node_index: Self::NodeIndex, consumer: Self::Consumer) -> Self;
#[doc(hidden)]
fn node_index(&self) -> Self::NodeIndex;
#[doc(hidden)]
fn consumer(&self) -> Self::Consumer;
}
pub trait ProducerIndex: Copy + Hash + Eq {
type NodeIndex: NodeIndex<Producer = Self::Producer>;
type Producer: Copy + Hash + Eq;
#[doc(hidden)]
fn new(node_index: Self::NodeIndex, producer: Self::Producer) -> Self;
#[doc(hidden)]
fn node_index(&self) -> Self::NodeIndex;
#[doc(hidden)]
fn producer(&self) -> Self::Producer;
}
#[doc(hidden)]
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct CommonConsumerIndex<NI>
where
NI: NodeIndex,
{
node_index: NI,
consumer: NI::Consumer,
}
impl<NI> ConsumerIndex for CommonConsumerIndex<NI>
where
NI: NodeIndex,
{
type NodeIndex = NI;
type Consumer = NI::Consumer;
fn new(node_index: Self::NodeIndex, consumer: Self::Consumer) -> Self {
Self {
node_index,
consumer,
}
}
fn node_index(&self) -> Self::NodeIndex {
self.node_index
}
fn consumer(&self) -> Self::Consumer {
self.consumer
}
}
#[doc(hidden)]
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct CommonProducerIndex<NI>
where
NI: NodeIndex,
{
node_index: NI,
producer: NI::Producer,
}
impl<NI> ProducerIndex for CommonProducerIndex<NI>
where
NI: NodeIndex,
{
type NodeIndex = NI;
type Producer = NI::Producer;
fn new(node_index: Self::NodeIndex, producer: Self::Producer) -> Self {
Self {
node_index,
producer,
}
}
fn node_index(&self) -> Self::NodeIndex {
self.node_index
}
fn producer(&self) -> Self::Producer {
self.producer
}
}