pub struct ReceivedMessages<'a, SD: SocketData>
{
received_message_helpers: Vec<ReceivedMessageHelper<'a, SD>>,
multi_message_headers: Vec<mmsghdr>,
}
impl<'a, SD: SocketData> ReceivedMessages<'a, SD>
{
pub fn new(receive_buffers: Vec<&'a mut [u8]>) -> Self
{
let capacity = receive_buffers.len();
let mut received_message_helpers = Vec::with_capacity(capacity);
let mut multi_message_headers = Vec::with_capacity(capacity);
for receive_buffer in receive_buffers
{
let mut received_message_helper = ReceivedMessageHelper::new(receive_buffer);
let multi_message_header = received_message_helper.new_multi_message_header();
multi_message_headers.push(multi_message_header);
received_message_helpers.push(received_message_helper);
}
Self
{
received_message_helpers,
multi_message_headers,
}
}
pub fn received_message_unchecked<'s: 'a>(&'s self, index: usize) -> Result<(&'a [u8], &'s SD, bool), ()>
{
debug_assert!(index < self.received_message_helpers.len(), "index `{}` is larger than self.message_helpers.len() `{}`", index, self.received_message_helpers.len());
let multi_message_header = self.multi_message_headers.get_unchecked_safe(index);
let flags = multi_message_header.msg_hdr.msg_flags;
let is_sctp_like_end_of_record = if likely!(flags == 0)
{
false
}
else if likely!(flags == MSG_EOR)
{
true
}
else
{
return Err(())
};
let length = multi_message_header.msg_len as usize;
let received_message_helper = self.received_message_helpers.get_unchecked_safe(index);
Ok((&received_message_helper.receive_buffer[0 .. length], &received_message_helper.remote_peer_address, is_sctp_like_end_of_record))
}
#[inline(always)]
pub fn capacity(&self) -> usize
{
self.received_message_helpers.len()
}
}