dope_core/io/socket/msg/
mod.rs1use std::mem;
2
3pub use builder::Builder;
4use dope_sys::io::{
5 self, socket,
6 socket::msg::{Header, Iovec},
7};
8
9use crate::io::transfer;
10
11mod builder;
12pub mod raw;
13
14pub const MAX_IOVECS: usize = <crate::Backend as socket::Socket>::MAX_IOVECS;
16
17pub struct Vectored<'a, const N: usize = MAX_IOVECS> {
19 message: Message<'a>,
20 iovs: &'a [Iovec],
21 bytes: transfer::Len,
22}
23
24impl<'a, const N: usize> Vectored<'a, N> {
25 #[must_use]
26 pub fn message(&self) -> Message<'a> {
27 self.message
28 }
29
30 #[must_use]
31 pub const fn bytes(&self) -> transfer::Len {
32 self.bytes
33 }
34
35 #[must_use]
36 pub fn is_empty(&self) -> bool {
37 self.bytes == transfer::Len::ZERO
38 }
39}
40
41impl<'a, const N: usize> Vectored<'a, N> {
42 fn from_parts(header: &'a mut Header, iovs: &'a [Iovec], bytes: transfer::Len) -> Self {
43 *header = Header::new();
44 header.bind(iovs);
45 Self {
46 message: Message { header },
47 iovs,
48 bytes,
49 }
50 }
51}
52
53#[derive(Clone, Copy)]
55#[repr(transparent)]
56pub struct Message<'a> {
57 header: &'a Header,
58}
59
60unsafe impl<'a> io::raw::Message<'a> for Message<'a> {
63 fn header(self) -> &'a Header {
64 self.header
65 }
66}
67
68const _: () = {
69 assert!(mem::size_of::<Message<'static>>() == mem::size_of::<&Header>());
70 assert!(mem::align_of::<Message<'static>>() == mem::align_of::<&Header>());
71 assert!(mem::size_of::<Option<Message<'static>>>() == mem::size_of::<Message<'static>>());
72};