Skip to content

Commit 9bb47e1

Browse files
committed
[eclipse-iceoryx#690] Add slice interface to active request
1 parent 5157bb1 commit 9bb47e1

File tree

4 files changed

+167
-47
lines changed

4 files changed

+167
-47
lines changed

iceoryx2/src/active_request.rs

+116-37
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ use crate::{
6060
raw_sample::{RawSample, RawSampleMut},
6161
response_mut::ResponseMut,
6262
response_mut_uninit::ResponseMutUninit,
63-
service,
63+
service::{self, builder::publish_subscribe::CustomPayloadMarker},
6464
};
6565

6666
/// Represents a one-to-one connection to a [`Client`](crate::port::client::Client)
@@ -73,9 +73,9 @@ use crate::{
7373
/// [`Response`](crate::response::Response)s.
7474
pub struct ActiveRequest<
7575
Service: crate::service::Service,
76-
RequestPayload: Debug + ZeroCopySend,
76+
RequestPayload: Debug + ZeroCopySend + ?Sized,
7777
RequestHeader: Debug + ZeroCopySend,
78-
ResponsePayload: Debug + ZeroCopySend,
78+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
7979
ResponseHeader: Debug + ZeroCopySend,
8080
> {
8181
pub(crate) ptr: RawSample<
@@ -96,9 +96,9 @@ pub struct ActiveRequest<
9696

9797
impl<
9898
Service: crate::service::Service,
99-
RequestPayload: Debug + ZeroCopySend,
99+
RequestPayload: Debug + ZeroCopySend + ?Sized,
100100
RequestHeader: Debug + ZeroCopySend,
101-
ResponsePayload: Debug + ZeroCopySend,
101+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
102102
ResponseHeader: Debug + ZeroCopySend,
103103
> Debug
104104
for ActiveRequest<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
@@ -121,9 +121,9 @@ impl<
121121

122122
impl<
123123
Service: crate::service::Service,
124-
RequestPayload: Debug + ZeroCopySend,
124+
RequestPayload: Debug + ZeroCopySend + ?Sized,
125125
RequestHeader: Debug + ZeroCopySend,
126-
ResponsePayload: Debug + ZeroCopySend,
126+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
127127
ResponseHeader: Debug + ZeroCopySend,
128128
> Deref
129129
for ActiveRequest<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
@@ -136,9 +136,9 @@ impl<
136136

137137
impl<
138138
Service: crate::service::Service,
139-
RequestPayload: Debug + ZeroCopySend,
139+
RequestPayload: Debug + ZeroCopySend + ?Sized,
140140
RequestHeader: Debug + ZeroCopySend,
141-
ResponsePayload: Debug + ZeroCopySend,
141+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
142142
ResponseHeader: Debug + ZeroCopySend,
143143
> Drop
144144
for ActiveRequest<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
@@ -169,9 +169,9 @@ impl<
169169

170170
impl<
171171
Service: crate::service::Service,
172-
RequestPayload: Debug + ZeroCopySend,
172+
RequestPayload: Debug + ZeroCopySend + ?Sized,
173173
RequestHeader: Debug + ZeroCopySend,
174-
ResponsePayload: Debug + ZeroCopySend,
174+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
175175
ResponseHeader: Debug + ZeroCopySend,
176176
> ActiveRequest<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
177177
{
@@ -194,6 +194,42 @@ impl<
194194
)
195195
}
196196

197+
/// Returns a reference to the payload of the received
198+
/// [`RequestMut`](crate::request_mut::RequestMut)
199+
pub fn payload(&self) -> &RequestPayload {
200+
self.ptr.as_payload_ref()
201+
}
202+
203+
/// Returns a reference to the user_header of the received
204+
/// [`RequestMut`](crate::request_mut::RequestMut)
205+
pub fn user_header(&self) -> &RequestHeader {
206+
self.ptr.as_user_header_ref()
207+
}
208+
209+
/// Returns a reference to the
210+
/// [`crate::service::header::request_response::RequestHeader`] of the received
211+
/// [`RequestMut`](crate::request_mut::RequestMut)
212+
pub fn header(&self) -> &crate::service::header::request_response::RequestHeader {
213+
self.ptr.as_header_ref()
214+
}
215+
216+
/// Returns the [`UniqueClientId`] of the [`Client`](crate::port::client::Client)
217+
pub fn origin(&self) -> UniqueClientId {
218+
UniqueClientId(UniqueSystemId::from(self.details.origin))
219+
}
220+
}
221+
222+
////////////////////////
223+
// BEGIN: typed API
224+
////////////////////////
225+
impl<
226+
Service: crate::service::Service,
227+
RequestPayload: Debug + ZeroCopySend + ?Sized,
228+
RequestHeader: Debug + ZeroCopySend,
229+
ResponsePayload: Debug + ZeroCopySend + Sized,
230+
ResponseHeader: Debug + ZeroCopySend,
231+
> ActiveRequest<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
232+
{
197233
/// Loans uninitialized memory for a [`ResponseMut`] where the user can write its payload to.
198234
///
199235
/// # Example
@@ -321,37 +357,13 @@ impl<
321357

322358
response.write_payload(value).send()
323359
}
324-
325-
/// Returns a reference to the payload of the received
326-
/// [`RequestMut`](crate::request_mut::RequestMut)
327-
pub fn payload(&self) -> &RequestPayload {
328-
self.ptr.as_payload_ref()
329-
}
330-
331-
/// Returns a reference to the user_header of the received
332-
/// [`RequestMut`](crate::request_mut::RequestMut)
333-
pub fn user_header(&self) -> &RequestHeader {
334-
self.ptr.as_user_header_ref()
335-
}
336-
337-
/// Returns a reference to the
338-
/// [`crate::service::header::request_response::RequestHeader`] of the received
339-
/// [`RequestMut`](crate::request_mut::RequestMut)
340-
pub fn header(&self) -> &crate::service::header::request_response::RequestHeader {
341-
self.ptr.as_header_ref()
342-
}
343-
344-
/// Returns the [`UniqueClientId`] of the [`Client`](crate::port::client::Client)
345-
pub fn origin(&self) -> UniqueClientId {
346-
UniqueClientId(UniqueSystemId::from(self.details.origin))
347-
}
348360
}
349361

350362
impl<
351363
Service: crate::service::Service,
352-
RequestPayload: Debug + ZeroCopySend,
364+
RequestPayload: Debug + ZeroCopySend + ?Sized,
353365
RequestHeader: Debug + ZeroCopySend,
354-
ResponsePayload: Debug + Default + ZeroCopySend,
366+
ResponsePayload: Debug + Default + ZeroCopySend + Sized,
355367
ResponseHeader: Debug + ZeroCopySend,
356368
> ActiveRequest<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
357369
{
@@ -388,3 +400,70 @@ impl<
388400
.write_payload(ResponsePayload::default()))
389401
}
390402
}
403+
////////////////////////
404+
// END: typed API
405+
////////////////////////
406+
407+
////////////////////////
408+
// BEGIN: sliced API
409+
////////////////////////
410+
impl<
411+
Service: crate::service::Service,
412+
RequestPayload: Debug + ZeroCopySend + ?Sized,
413+
RequestHeader: Debug + ZeroCopySend,
414+
ResponsePayload: Debug + Default + ZeroCopySend,
415+
ResponseHeader: Debug + ZeroCopySend,
416+
> ActiveRequest<Service, RequestPayload, RequestHeader, [ResponsePayload], ResponseHeader>
417+
{
418+
pub fn loan_slice(
419+
&self,
420+
number_of_elements: usize,
421+
) -> Result<ResponseMut<Service, [ResponsePayload], ResponseHeader>, LoanError> {
422+
todo!()
423+
}
424+
}
425+
426+
impl<
427+
Service: crate::service::Service,
428+
RequestPayload: Debug + ZeroCopySend + ?Sized,
429+
RequestHeader: Debug + ZeroCopySend,
430+
ResponsePayload: Debug + ZeroCopySend,
431+
ResponseHeader: Debug + ZeroCopySend,
432+
> ActiveRequest<Service, RequestPayload, RequestHeader, [ResponsePayload], ResponseHeader>
433+
{
434+
pub fn loan_slice_uninit(
435+
&self,
436+
number_of_elements: usize,
437+
) -> Result<ResponseMutUninit<Service, [MaybeUninit<ResponsePayload>], ResponseHeader>, LoanError>
438+
{
439+
todo!()
440+
}
441+
}
442+
443+
impl<
444+
Service: crate::service::Service,
445+
RequestHeader: Debug + ZeroCopySend,
446+
ResponseHeader: Debug + ZeroCopySend,
447+
>
448+
ActiveRequest<
449+
Service,
450+
[CustomPayloadMarker],
451+
RequestHeader,
452+
[CustomPayloadMarker],
453+
ResponseHeader,
454+
>
455+
{
456+
#[doc(hidden)]
457+
pub unsafe fn loan_custom_payload(
458+
&self,
459+
slice_len: usize,
460+
) -> Result<
461+
ResponseMutUninit<Service, [MaybeUninit<CustomPayloadMarker>], ResponseHeader>,
462+
LoanError,
463+
> {
464+
todo!()
465+
}
466+
}
467+
////////////////////////
468+
// END: sliced API
469+
////////////////////////

iceoryx2/src/raw_sample.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ impl<Header, UserHeader, Payload> Clone for RawSampleMut<Header, UserHeader, Pay
202202

203203
impl<Header, UserHeader, Payload> Copy for RawSampleMut<Header, UserHeader, Payload> {}
204204

205-
impl<Header, UserHeader, Payload> fmt::Debug for RawSampleMut<Header, UserHeader, Payload> {
205+
impl<Header, UserHeader, Payload: ?Sized> fmt::Debug for RawSampleMut<Header, UserHeader, Payload> {
206206
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
207207
write!(
208208
f,

iceoryx2/src/response_mut.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ use crate::{
7171
/// scope.
7272
pub struct ResponseMut<
7373
Service: service::Service,
74-
ResponsePayload: Debug + ZeroCopySend,
74+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
7575
ResponseHeader: Debug + ZeroCopySend,
7676
> {
7777
pub(crate) ptr: RawSampleMut<
@@ -91,7 +91,7 @@ pub struct ResponseMut<
9191

9292
impl<
9393
Service: crate::service::Service,
94-
ResponsePayload: Debug + ZeroCopySend,
94+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
9595
ResponseHeader: Debug + ZeroCopySend,
9696
> Debug for ResponseMut<Service, ResponsePayload, ResponseHeader>
9797
{
@@ -112,7 +112,7 @@ impl<
112112

113113
impl<
114114
Service: crate::service::Service,
115-
ResponsePayload: Debug + ZeroCopySend,
115+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
116116
ResponseHeader: Debug + ZeroCopySend,
117117
> Drop for ResponseMut<Service, ResponsePayload, ResponseHeader>
118118
{
@@ -126,7 +126,7 @@ impl<
126126

127127
impl<
128128
Service: crate::service::Service,
129-
ResponsePayload: Debug + ZeroCopySend,
129+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
130130
ResponseHeader: Debug + ZeroCopySend,
131131
> Deref for ResponseMut<Service, ResponsePayload, ResponseHeader>
132132
{
@@ -138,7 +138,7 @@ impl<
138138

139139
impl<
140140
Service: crate::service::Service,
141-
ResponsePayload: Debug + ZeroCopySend,
141+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
142142
ResponseHeader: Debug + ZeroCopySend,
143143
> DerefMut for ResponseMut<Service, ResponsePayload, ResponseHeader>
144144
{
@@ -149,7 +149,7 @@ impl<
149149

150150
impl<
151151
Service: crate::service::Service,
152-
ResponsePayload: Debug + ZeroCopySend,
152+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
153153
ResponseHeader: Debug + ZeroCopySend,
154154
> ResponseMut<Service, ResponsePayload, ResponseHeader>
155155
{

iceoryx2/src/response_mut_uninit.rs

+44-3
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,15 @@ use core::{fmt::Debug, mem::MaybeUninit};
5959
/// The generic parameter `Payload` is actually [`core::mem::MaybeUninit<Payload>`].
6060
pub struct ResponseMutUninit<
6161
Service: service::Service,
62-
ResponsePayload: Debug + ZeroCopySend,
62+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
6363
ResponseHeader: Debug + ZeroCopySend,
6464
> {
6565
pub(crate) response: ResponseMut<Service, ResponsePayload, ResponseHeader>,
6666
}
6767

6868
impl<
6969
Service: crate::service::Service,
70-
ResponsePayload: Debug + ZeroCopySend,
70+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
7171
ResponseHeader: Debug + ZeroCopySend,
7272
> Debug for ResponseMutUninit<Service, ResponsePayload, ResponseHeader>
7373
{
@@ -78,7 +78,7 @@ impl<
7878

7979
impl<
8080
Service: crate::service::Service,
81-
ResponsePayload: Debug + ZeroCopySend,
81+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
8282
ResponseHeader: Debug + ZeroCopySend,
8383
> ResponseMutUninit<Service, ResponsePayload, ResponseHeader>
8484
{
@@ -292,3 +292,44 @@ impl<
292292
core::mem::transmute(self.response)
293293
}
294294
}
295+
296+
impl<
297+
Service: crate::service::Service,
298+
ResponsePayload: Debug + ZeroCopySend,
299+
ResponseHeader: Debug + ZeroCopySend,
300+
> ResponseMutUninit<Service, [MaybeUninit<ResponsePayload>], ResponseHeader>
301+
{
302+
pub unsafe fn assume_init(self) -> ResponseMut<Service, [ResponsePayload], ResponseHeader> {
303+
// the transmute is not nice but safe since MaybeUninit is #[repr(transparent)] to the inner type
304+
core::mem::transmute(self.response)
305+
}
306+
307+
pub fn write_from_fn<F: FnMut(usize) -> ResponsePayload>(
308+
mut self,
309+
mut initializer: F,
310+
) -> ResponseMut<Service, [ResponsePayload], ResponseHeader> {
311+
for (i, element) in self.payload_mut().iter_mut().enumerate() {
312+
element.write(initializer(i));
313+
}
314+
315+
// SAFETY: this is safe since the payload was initialized on the line above
316+
unsafe { self.assume_init() }
317+
}
318+
}
319+
320+
impl<
321+
Service: crate::service::Service,
322+
ResponsePayload: Debug + Copy + ZeroCopySend,
323+
ResponseHeader: Debug + ZeroCopySend,
324+
> ResponseMutUninit<Service, [MaybeUninit<ResponsePayload>], ResponseHeader>
325+
{
326+
pub fn write_from_slice(
327+
mut self,
328+
value: &[ResponsePayload],
329+
) -> ResponseMut<Service, [ResponsePayload], ResponseHeader> {
330+
self.payload_mut().copy_from_slice(unsafe {
331+
core::mem::transmute::<&[ResponsePayload], &[MaybeUninit<ResponsePayload>]>(value)
332+
});
333+
unsafe { self.assume_init() }
334+
}
335+
}

0 commit comments

Comments
 (0)