use std::{io, net::SocketAddr};
use super::TcpStream;
use crate::io::{
as_fd::{AsReadFd, AsWriteFd, SharedFdWrapper},
OwnedReadHalf, OwnedWriteHalf, ReadHalf, WriteHalf,
};
pub type TcpReadHalf<'a> = ReadHalf<'a, TcpStream>;
pub type TcpWriteHalf<'a> = WriteHalf<'a, TcpStream>;
#[allow(clippy::cast_ref_to_mut)]
impl<'t> AsReadFd for TcpReadHalf<'t> {
fn as_reader_fd(&mut self) -> &SharedFdWrapper {
let raw_stream = unsafe { &mut *(self.0 as *const TcpStream as *mut TcpStream) };
raw_stream.as_reader_fd()
}
}
#[allow(clippy::cast_ref_to_mut)]
impl<'t> AsWriteFd for TcpWriteHalf<'t> {
fn as_writer_fd(&mut self) -> &SharedFdWrapper {
let raw_stream = unsafe { &mut *(self.0 as *const TcpStream as *mut TcpStream) };
raw_stream.as_writer_fd()
}
}
pub type TcpOwnedReadHalf = OwnedReadHalf<TcpStream>;
pub type TcpOwnedWriteHalf = OwnedWriteHalf<TcpStream>;
impl TcpOwnedReadHalf {
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
unsafe { &*self.0.get() }.peer_addr()
}
pub fn local_addr(&self) -> io::Result<SocketAddr> {
unsafe { &*self.0.get() }.local_addr()
}
}
impl AsReadFd for TcpOwnedReadHalf {
fn as_reader_fd(&mut self) -> &SharedFdWrapper {
let raw_stream = unsafe { &mut *self.0.get() };
raw_stream.as_reader_fd()
}
}
impl TcpOwnedWriteHalf {
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
unsafe { &*self.0.get() }.peer_addr()
}
pub fn local_addr(&self) -> io::Result<SocketAddr> {
unsafe { &*self.0.get() }.local_addr()
}
}
impl AsWriteFd for TcpOwnedWriteHalf {
fn as_writer_fd(&mut self) -> &SharedFdWrapper {
let raw_stream = unsafe { &mut *self.0.get() };
raw_stream.as_writer_fd()
}
}