use std::ops::Add;
use super::Type;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Memory {
pub buffer: StreamMemory,
pub ty: Type,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum StreamMemory {
NoMemory,
Static(StreamBuffer),
Dynamic {
buffer: StreamBuffer,
has_spawn: bool,
has_close: bool,
},
Instances {
buffer: StreamBuffer,
parameter: Vec<Parameter>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Copy)]
pub enum StreamBuffer {
SingleValue,
Bounded(usize),
UnBounded,
}
impl StreamBuffer {
pub fn bound(&self) -> Option<usize> {
match self {
StreamBuffer::SingleValue => Some(1),
StreamBuffer::Bounded(b) => Some(*b),
StreamBuffer::UnBounded => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Parameter {
pub name: String,
pub ty: Type,
}
impl Memory {
pub fn parameters(&self) -> Option<&[Parameter]> {
self.buffer.parameters()
}
pub fn num_parameters(&self) -> usize {
self.buffer.num_parameters()
}
}
impl StreamMemory {
pub fn parameters(&self) -> Option<&[Parameter]> {
match self {
StreamMemory::Instances {
buffer: _,
parameter,
} => Some(parameter),
_ => None,
}
}
pub fn num_parameters(&self) -> usize {
match self {
StreamMemory::Instances {
buffer: _,
parameter,
} => parameter.len(),
_ => 0,
}
}
}
impl StreamMemory {
pub fn buffer(&self) -> Option<&StreamBuffer> {
match self {
StreamMemory::NoMemory => None,
StreamMemory::Static(buffer)
| StreamMemory::Dynamic { buffer, .. }
| StreamMemory::Instances { buffer, .. } => Some(buffer),
}
}
}
impl Add for StreamMemory {
type Output = StreamMemory;
fn add(self, rhs: Self) -> Self::Output {
assert!(self == rhs);
self
}
}