use crate::message;
pub trait Behavior {
fn advance<Message: message::Message>(
&self,
primary: &mut [Message],
secondary: &mut [Message],
start: usize,
end: usize,
overflow: usize,
);
fn cancel<Message: message::Message>(
&self,
primary: &mut [Message],
secondary: &mut [Message],
start: usize,
end: usize,
overflow: usize,
);
}
#[derive(Debug)]
pub struct Occupied {
pub(crate) mtu: usize,
}
impl Behavior for Occupied {
fn advance<Message: message::Message>(
&self,
primary: &mut [Message],
secondary: &mut [Message],
start: usize,
end: usize,
overflow: usize,
) {
reset(&mut primary[start..end], self.mtu);
reset(&mut primary[..overflow], self.mtu);
reset(&mut secondary[start..end], self.mtu);
reset(&mut secondary[..overflow], self.mtu);
}
fn cancel<Message: message::Message>(
&self,
_primary: &mut [Message],
_secondary: &mut [Message],
_start: usize,
_end: usize,
_overflow: usize,
) {
}
}
#[derive(Debug)]
pub struct Free {
pub(crate) mtu: usize,
}
impl Free {
fn replicate<Message: message::Message>(&self, from: &mut [Message], to: &mut [Message]) {
for (from_msg, to_msg) in from.iter_mut().zip(to.iter_mut()) {
to_msg.replicate_fields_from(from_msg);
}
}
}
impl Behavior for Free {
fn advance<Message: message::Message>(
&self,
primary: &mut [Message],
secondary: &mut [Message],
start: usize,
end: usize,
overflow: usize,
) {
self.replicate(&mut primary[start..end], &mut secondary[start..end]);
self.replicate(&mut secondary[..overflow], &mut primary[..overflow]);
}
fn cancel<Message: message::Message>(
&self,
primary: &mut [Message],
secondary: &mut [Message],
start: usize,
end: usize,
overflow: usize,
) {
reset(&mut primary[start..end], self.mtu);
reset(&mut primary[..overflow], self.mtu);
reset(&mut secondary[start..end], self.mtu);
reset(&mut secondary[..overflow], self.mtu);
}
}
#[inline]
fn reset<Message: message::Message>(messages: &mut [Message], mtu: usize) {
for message in messages {
unsafe {
message.reset(mtu);
}
}
}