use crate::prelude::*;
#[derive(Block)]
pub struct Copy<
T: Send + Sync + 'static,
I: CpuBufferReader<Item = T> = DefaultCpuReader<T>,
O: CpuBufferWriter<Item = T> = DefaultCpuWriter<T>,
> {
#[input]
input: I,
#[output]
output: O,
}
impl<T, I, O> Copy<T, I, O>
where
T: Send + Sync + 'static,
I: CpuBufferReader<Item = T>,
O: CpuBufferWriter<Item = T>,
{
pub fn new() -> Self {
Self {
input: I::default(),
output: O::default(),
}
}
}
impl<T, I, O> Default for Copy<T, I, O>
where
T: Send + Sync + 'static,
I: CpuBufferReader<Item = T>,
O: CpuBufferWriter<Item = T>,
{
fn default() -> Self {
Self::new()
}
}
#[doc(hidden)]
impl<T, I, O> Kernel for Copy<T, I, O>
where
T: std::marker::Copy + Send + Sync + 'static,
I: CpuBufferReader<Item = T>,
O: CpuBufferWriter<Item = T>,
{
async fn work(
&mut self,
io: &mut WorkIo,
_mio: &mut MessageOutputs,
_meta: &mut BlockMeta,
) -> Result<()> {
let i = self.input.slice();
let o = self.output.slice();
let i_len = i.len();
let m = std::cmp::min(i.len(), o.len());
if m > 0 {
o[..m].copy_from_slice(&i[..m]);
self.input.consume(m);
self.output.produce(m);
}
if self.input.finished() && m == i_len {
io.finished = true;
}
Ok(())
}
}