use std::mem;
pub use builder::Builder;
use dope_sys::io::{
self, socket,
socket::msg::{Header, Iovec},
};
use crate::io::transfer;
mod builder;
pub mod raw;
pub const MAX_IOVECS: usize = <crate::Backend as socket::Socket>::MAX_IOVECS;
pub struct Vectored<'a, const N: usize = MAX_IOVECS> {
message: Message<'a>,
iovs: &'a [Iovec],
bytes: transfer::Len,
}
impl<'a, const N: usize> Vectored<'a, N> {
#[must_use]
pub fn message(&self) -> Message<'a> {
self.message
}
#[must_use]
pub const fn bytes(&self) -> transfer::Len {
self.bytes
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.bytes == transfer::Len::ZERO
}
}
impl<'a, const N: usize> Vectored<'a, N> {
fn from_parts(header: &'a mut Header, iovs: &'a [Iovec], bytes: transfer::Len) -> Self {
*header = Header::new();
header.bind(iovs);
Self {
message: Message { header },
iovs,
bytes,
}
}
}
#[derive(Clone, Copy)]
#[repr(transparent)]
pub struct Message<'a> {
header: &'a Header,
}
unsafe impl<'a> io::raw::Message<'a> for Message<'a> {
fn header(self) -> &'a Header {
self.header
}
}
const _: () = {
assert!(mem::size_of::<Message<'static>>() == mem::size_of::<&Header>());
assert!(mem::align_of::<Message<'static>>() == mem::align_of::<&Header>());
assert!(mem::size_of::<Option<Message<'static>>>() == mem::size_of::<Message<'static>>());
};