use iceoryx2_bb_elementary_traits::zero_copy_send::ZeroCopySend;
use crate::{port::client::ClientSharedState, request_mut::RequestMut, service};
use core::{fmt::Debug, mem::MaybeUninit};
#[repr(transparent)]
pub struct RequestMutUninit<
Service: crate::service::Service,
RequestPayload: Debug + ZeroCopySend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> {
pub(crate) request:
RequestMut<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>,
}
unsafe impl<
Service: crate::service::Service,
RequestPayload: Debug + ZeroCopySend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> Send
for RequestMutUninit<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
where
Service::ArcThreadSafetyPolicy<ClientSharedState<Service>>: Send + Sync,
{
}
impl<
Service: crate::service::Service,
RequestPayload: Debug + ZeroCopySend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> Debug
for RequestMutUninit<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
{
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "RequestMutUninit {{ request: {:?} }}", self.request)
}
}
impl<
Service: crate::service::Service,
RequestPayload: Debug + ZeroCopySend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> RequestMutUninit<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
{
pub fn header(&self) -> &service::header::request_response::RequestHeader {
self.request.header()
}
pub fn user_header(&self) -> &RequestHeader {
self.request.user_header()
}
pub fn user_header_mut(&mut self) -> &mut RequestHeader {
self.request.user_header_mut()
}
pub fn payload(&self) -> &RequestPayload {
self.request.payload()
}
pub fn payload_mut(&mut self) -> &mut RequestPayload {
self.request.payload_mut()
}
}
impl<
Service: crate::service::Service,
RequestPayload: Debug + ZeroCopySend + Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
>
RequestMutUninit<
Service,
MaybeUninit<RequestPayload>,
RequestHeader,
ResponsePayload,
ResponseHeader,
>
{
pub fn write_payload(
mut self,
value: RequestPayload,
) -> RequestMut<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader> {
self.payload_mut().write(value);
unsafe { self.assume_init() }
}
pub unsafe fn assume_init(
self,
) -> RequestMut<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader> {
let initialized_request = core::mem::transmute_copy(&self.request);
core::mem::forget(self);
initialized_request
}
}
impl<
Service: crate::service::Service,
RequestPayload: Debug + ZeroCopySend,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
>
RequestMutUninit<
Service,
[MaybeUninit<RequestPayload>],
RequestHeader,
ResponsePayload,
ResponseHeader,
>
{
pub unsafe fn assume_init(
self,
) -> RequestMut<Service, [RequestPayload], RequestHeader, ResponsePayload, ResponseHeader> {
let initialized_request = core::mem::transmute_copy(&self.request);
core::mem::forget(self);
initialized_request
}
pub fn write_from_fn<F: FnMut(usize) -> RequestPayload>(
mut self,
mut initializer: F,
) -> RequestMut<Service, [RequestPayload], RequestHeader, 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,
RequestPayload: Debug + Copy + ZeroCopySend,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + ZeroCopySend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
>
RequestMutUninit<
Service,
[MaybeUninit<RequestPayload>],
RequestHeader,
ResponsePayload,
ResponseHeader,
>
{
pub fn write_from_slice(
mut self,
value: &[RequestPayload],
) -> RequestMut<Service, [RequestPayload], RequestHeader, ResponsePayload, ResponseHeader> {
self.payload_mut().copy_from_slice(unsafe {
core::mem::transmute::<&[RequestPayload], &[MaybeUninit<RequestPayload>]>(value)
});
unsafe { self.assume_init() }
}
}