use iceoryx2_bb_elementary_traits::zero_copy_send::ZeroCopySend;
use crate::{port::server::SharedServerState, response_mut::ResponseMut, service};
use core::{fmt::Debug, mem::MaybeUninit};
pub struct ResponseMutUninit<
Service: service::Service,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> {
pub(crate) response: ResponseMut<Service, ResponsePayload, ResponseHeader>,
}
unsafe impl<
Service: crate::service::Service,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> Send for ResponseMutUninit<Service, ResponsePayload, ResponseHeader>
where
Service::ArcThreadSafetyPolicy<SharedServerState<Service>>: Send + Sync,
{
}
impl<
Service: crate::service::Service,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> Debug for ResponseMutUninit<Service, ResponsePayload, ResponseHeader>
{
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "ResponseMut {{ response: {:?} }}", self.response)
}
}
impl<
Service: crate::service::Service,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> ResponseMutUninit<Service, ResponsePayload, ResponseHeader>
{
pub fn header(&self) -> &service::header::request_response::ResponseHeader {
self.response.header()
}
pub fn user_header(&self) -> &ResponseHeader {
self.response.user_header()
}
pub fn user_header_mut(&mut self) -> &mut ResponseHeader {
self.response.user_header_mut()
}
pub fn payload(&self) -> &ResponsePayload {
self.response.payload()
}
pub fn payload_mut(&mut self) -> &mut ResponsePayload {
self.response.payload_mut()
}
}
impl<
Service: crate::service::Service,
ResponsePayload: Debug + ZeroCopySend,
ResponseHeader: Debug + ZeroCopySend,
> ResponseMutUninit<Service, MaybeUninit<ResponsePayload>, ResponseHeader>
{
pub fn write_payload(
mut self,
value: ResponsePayload,
) -> ResponseMut<Service, ResponsePayload, ResponseHeader> {
self.payload_mut().write(value);
unsafe { self.assume_init() }
}
pub unsafe fn assume_init(self) -> ResponseMut<Service, ResponsePayload, ResponseHeader> {
let initialized_response = core::mem::transmute_copy(&self.response);
core::mem::forget(self);
initialized_response
}
}
impl<
Service: crate::service::Service,
ResponsePayload: Debug + ZeroCopySend,
ResponseHeader: Debug + ZeroCopySend,
> ResponseMutUninit<Service, [MaybeUninit<ResponsePayload>], ResponseHeader>
{
pub unsafe fn assume_init(self) -> ResponseMut<Service, [ResponsePayload], ResponseHeader> {
let initialized_response = core::mem::transmute_copy(&self.response);
core::mem::forget(self);
initialized_response
}
pub fn write_from_fn<F: FnMut(usize) -> ResponsePayload>(
mut self,
mut initializer: F,
) -> ResponseMut<Service, [ResponsePayload], ResponseHeader> {
for (i, element) in self.payload_mut().iter_mut().enumerate() {
element.write(initializer(i));
}
unsafe { self.assume_init() }
}
}
impl<
Service: crate::service::Service,
ResponsePayload: Debug + Copy + ZeroCopySend,
ResponseHeader: Debug + ZeroCopySend,
> ResponseMutUninit<Service, [MaybeUninit<ResponsePayload>], ResponseHeader>
{
pub fn write_from_slice(
mut self,
value: &[ResponsePayload],
) -> ResponseMut<Service, [ResponsePayload], ResponseHeader> {
self.payload_mut().copy_from_slice(unsafe {
core::mem::transmute::<&[ResponsePayload], &[MaybeUninit<ResponsePayload>]>(value)
});
unsafe { self.assume_init() }
}
}