use crate::{
port::publisher::PublisherSharedState, port::SendError, raw_sample::RawSampleMut,
service::header::publish_subscribe::Header,
};
use iceoryx2_bb_elementary_traits::zero_copy_send::ZeroCopySend;
use iceoryx2_cal::arc_sync_policy::ArcSyncPolicy;
use iceoryx2_cal::shared_memory::*;
use core::fmt::{Debug, Formatter};
use core::ops::{Deref, DerefMut};
pub struct SampleMut<
Service: crate::service::Service,
Payload: Debug + ZeroCopySend + ?Sized,
UserHeader: ZeroCopySend,
> {
pub(crate) publisher_shared_state:
Service::ArcThreadSafetyPolicy<PublisherSharedState<Service>>,
pub(crate) ptr: RawSampleMut<Header, UserHeader, Payload>,
pub(crate) offset_to_chunk: PointerOffset,
pub(crate) sample_size: usize,
}
unsafe impl<
Service: crate::service::Service,
Payload: Debug + ZeroCopySend + ?Sized,
UserHeader: ZeroCopySend,
> Send for SampleMut<Service, Payload, UserHeader>
where
Service::ArcThreadSafetyPolicy<PublisherSharedState<Service>>: Send + Sync,
{
}
impl<
Service: crate::service::Service,
Payload: Debug + ZeroCopySend + ?Sized,
UserHeader: ZeroCopySend,
> Deref for SampleMut<Service, Payload, UserHeader>
{
type Target = Payload;
fn deref(&self) -> &Self::Target {
self.ptr.as_payload_ref()
}
}
impl<
Service: crate::service::Service,
Payload: Debug + ZeroCopySend + ?Sized,
UserHeader: ZeroCopySend,
> DerefMut for SampleMut<Service, Payload, UserHeader>
{
fn deref_mut(&mut self) -> &mut Self::Target {
self.ptr.as_payload_mut()
}
}
impl<
Service: crate::service::Service,
Payload: Debug + ZeroCopySend + ?Sized,
UserHeader: ZeroCopySend,
> Debug for SampleMut<Service, Payload, UserHeader>
{
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
write!(
f,
"SampleMut<{}, {}, {}> {{ publisher_shared_state: {:?}, offset_to_chunk: {:?}, sample_size: {} }}",
core::any::type_name::<Service>(),
core::any::type_name::<Payload>(),
core::any::type_name::<UserHeader>(),
self.publisher_shared_state,
self.offset_to_chunk,
self.sample_size
)
}
}
impl<
Service: crate::service::Service,
Payload: Debug + ZeroCopySend + ?Sized,
UserHeader: ZeroCopySend,
> Drop for SampleMut<Service, Payload, UserHeader>
{
fn drop(&mut self) {
self.publisher_shared_state
.lock()
.sender
.return_loaned_sample(self.offset_to_chunk);
}
}
impl<
Service: crate::service::Service,
M: Debug + ZeroCopySend + ?Sized, UserHeader: ZeroCopySend,
> SampleMut<Service, M, UserHeader>
{
pub fn header(&self) -> &Header {
self.ptr.as_header_ref()
}
pub fn user_header(&self) -> &UserHeader {
self.ptr.as_user_header_ref()
}
pub fn user_header_mut(&mut self) -> &mut UserHeader {
self.ptr.as_user_header_mut()
}
pub fn payload(&self) -> &M {
self.ptr.as_payload_ref()
}
pub fn payload_mut(&mut self) -> &mut M {
self.ptr.as_payload_mut()
}
pub fn send(self) -> Result<usize, SendError> {
self.publisher_shared_state
.lock()
.send_sample(self.offset_to_chunk, self.sample_size)
}
}