use std::io;
use std::os::fd::RawFd;
use std::pin::Pin;
use crate::thin::ThinBoxSubscriber;
use crate::{EventpOps, EventpOpsAdd, Interest};
pub struct Pinned<'a, Ep>(pub Pin<&'a mut Ep>);
impl<'a, Ep> Pinned<'a, Ep> {
pub fn as_mut(&mut self) -> Pinned<'_, Ep> {
Pinned(self.0.as_mut())
}
}
impl<'a, Ep: EventpOps> EventpOpsAdd<Ep> for Pinned<'a, Ep> {
#[doc = include_str!("../docs/eventp-ops.add.md")]
fn add(&mut self, subscriber: ThinBoxSubscriber<Ep>) -> io::Result<()> {
unsafe { self.0.as_mut().get_unchecked_mut().add(subscriber) }
}
}
impl<'a, Ep> Pinned<'a, Ep>
where
Ep: EventpOps,
{
#[doc = include_str!("../docs/eventp-ops.modify.md")]
pub fn modify(&mut self, fd: RawFd, interest: Interest) -> io::Result<()> {
unsafe { self.0.as_mut().get_unchecked_mut().modify(fd, interest) }
}
#[doc = include_str!("../docs/eventp-ops.delete.md")]
pub fn delete(&mut self, fd: RawFd) -> io::Result<()> {
unsafe { self.0.as_mut().get_unchecked_mut().delete(fd) }
}
}
#[macro_export]
macro_rules! pinned {
($value:expr $(,)?) => {
$crate::Pinned(::std::pin::pin!($value))
};
}