Skip to content

Commit 7a22ac0

Browse files
committed
[eclipse-iceoryx#690] Add slice interface to server and client
1 parent 6922f5d commit 7a22ac0

File tree

6 files changed

+206
-33
lines changed

6 files changed

+206
-33
lines changed

iceoryx2/src/port/client.rs

+90-5
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ use crate::{
6161
request_mut_uninit::RequestMutUninit,
6262
service::{
6363
self,
64+
builder::publish_subscribe::CustomPayloadMarker,
6465
dynamic_config::request_response::{ClientDetails, ServerDetails},
6566
naming_scheme::data_segment_name,
6667
port_factory::client::{ClientCreateError, PortFactoryClient},
@@ -249,9 +250,9 @@ impl<Service: service::Service> ClientSharedState<Service> {
249250
#[derive(Debug)]
250251
pub struct Client<
251252
Service: service::Service,
252-
RequestPayload: Debug + ZeroCopySend,
253+
RequestPayload: Debug + ZeroCopySend + ?Sized,
253254
RequestHeader: Debug + ZeroCopySend,
254-
ResponsePayload: Debug + ZeroCopySend,
255+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
255256
ResponseHeader: Debug + ZeroCopySend,
256257
> {
257258
client_port_id: UniqueClientId,
@@ -265,9 +266,9 @@ pub struct Client<
265266

266267
impl<
267268
Service: service::Service,
268-
RequestPayload: Debug + ZeroCopySend,
269+
RequestPayload: Debug + ZeroCopySend + ?Sized,
269270
RequestHeader: Debug + ZeroCopySend,
270-
ResponsePayload: Debug + ZeroCopySend,
271+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
271272
ResponseHeader: Debug + ZeroCopySend,
272273
> Client<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
273274
{
@@ -440,7 +441,19 @@ impl<
440441
.request_sender
441442
.unable_to_deliver_strategy
442443
}
444+
}
443445

446+
////////////////////////
447+
// BEGIN: typed API
448+
////////////////////////
449+
impl<
450+
Service: service::Service,
451+
RequestPayload: Debug + ZeroCopySend,
452+
RequestHeader: Debug + ZeroCopySend,
453+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
454+
ResponseHeader: Debug + ZeroCopySend,
455+
> Client<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
456+
{
444457
/// Acquires an [`RequestMutUninit`] to store payload. This API shall be used
445458
/// by default to avoid unnecessary copies.
446459
///
@@ -585,7 +598,7 @@ impl<
585598
Service: service::Service,
586599
RequestPayload: Debug + Default + ZeroCopySend,
587600
RequestHeader: Debug + ZeroCopySend,
588-
ResponsePayload: Debug + ZeroCopySend,
601+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
589602
ResponseHeader: Debug + ZeroCopySend,
590603
> Client<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
591604
{
@@ -627,3 +640,75 @@ impl<
627640
Ok(self.loan_uninit()?.write_payload(RequestPayload::default()))
628641
}
629642
}
643+
644+
////////////////////////
645+
// END: typed API
646+
////////////////////////
647+
648+
////////////////////////
649+
// BEGIN: sliced API
650+
////////////////////////
651+
impl<
652+
Service: service::Service,
653+
RequestPayload: Default + Debug + ZeroCopySend,
654+
RequestHeader: Debug + ZeroCopySend,
655+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
656+
ResponseHeader: Debug + ZeroCopySend,
657+
> Client<Service, [RequestPayload], RequestHeader, ResponsePayload, ResponseHeader>
658+
{
659+
pub fn loan_slice(
660+
&self,
661+
number_of_elements: usize,
662+
) -> Result<
663+
RequestMut<Service, [RequestPayload], RequestHeader, ResponsePayload, ResponseHeader>,
664+
LoanError,
665+
> {
666+
todo!()
667+
}
668+
}
669+
670+
impl<
671+
Service: service::Service,
672+
RequestPayload: Debug + ZeroCopySend,
673+
RequestHeader: Debug + ZeroCopySend,
674+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
675+
ResponseHeader: Debug + ZeroCopySend,
676+
> Client<Service, [RequestPayload], RequestHeader, ResponsePayload, ResponseHeader>
677+
{
678+
pub fn loan_slice_uninit(
679+
&self,
680+
number_of_elements: usize,
681+
) -> Result<
682+
RequestMut<Service, [RequestPayload], RequestHeader, ResponsePayload, ResponseHeader>,
683+
LoanError,
684+
> {
685+
todo!()
686+
}
687+
}
688+
689+
impl<
690+
Service: service::Service,
691+
RequestHeader: Debug + ZeroCopySend,
692+
ResponseHeader: Debug + ZeroCopySend,
693+
> Client<Service, [CustomPayloadMarker], RequestHeader, [CustomPayloadMarker], ResponseHeader>
694+
{
695+
#[doc(hidden)]
696+
pub fn loan_custom_payload(
697+
&self,
698+
number_of_elements: usize,
699+
) -> Result<
700+
RequestMut<
701+
Service,
702+
[CustomPayloadMarker],
703+
RequestHeader,
704+
[CustomPayloadMarker],
705+
ResponseHeader,
706+
>,
707+
LoanError,
708+
> {
709+
todo!()
710+
}
711+
}
712+
////////////////////////
713+
// END: sliced API
714+
////////////////////////

iceoryx2/src/port/server.rs

+39-4
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,9 @@ impl<Service: service::Service> SharedServerState<Service> {
168168
#[derive(Debug)]
169169
pub struct Server<
170170
Service: service::Service,
171-
RequestPayload: Debug + ZeroCopySend,
171+
RequestPayload: Debug + ZeroCopySend + ?Sized,
172172
RequestHeader: Debug + ZeroCopySend,
173-
ResponsePayload: Debug + ZeroCopySend,
173+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
174174
ResponseHeader: Debug + ZeroCopySend,
175175
> {
176176
shared_state: Arc<SharedServerState<Service>>,
@@ -184,9 +184,9 @@ pub struct Server<
184184

185185
impl<
186186
Service: service::Service,
187-
RequestPayload: Debug + ZeroCopySend,
187+
RequestPayload: Debug + ZeroCopySend + ?Sized,
188188
RequestHeader: Debug + ZeroCopySend,
189-
ResponsePayload: Debug + ZeroCopySend,
189+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
190190
ResponseHeader: Debug + ZeroCopySend,
191191
> Server<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
192192
{
@@ -368,7 +368,16 @@ impl<
368368
.request_receiver
369369
.receive(REQUEST_CHANNEL_ID)
370370
}
371+
}
371372

373+
impl<
374+
Service: service::Service,
375+
RequestPayload: Debug + ZeroCopySend,
376+
RequestHeader: Debug + ZeroCopySend,
377+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
378+
ResponseHeader: Debug + ZeroCopySend,
379+
> Server<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
380+
{
372381
/// Receives a [`RequestMut`](crate::request_mut::RequestMut) that was sent by a
373382
/// [`Client`](crate::port::client::Client) and returns an [`ActiveRequest`] which
374383
/// can be used to respond.
@@ -448,3 +457,29 @@ impl<
448457
}
449458
}
450459
}
460+
461+
impl<
462+
Service: service::Service,
463+
RequestPayload: Debug + ZeroCopySend,
464+
RequestHeader: Debug + ZeroCopySend,
465+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
466+
ResponseHeader: Debug + ZeroCopySend,
467+
> Server<Service, [RequestPayload], RequestHeader, ResponsePayload, ResponseHeader>
468+
{
469+
pub fn receive(
470+
&self,
471+
) -> Result<
472+
Option<
473+
ActiveRequest<
474+
Service,
475+
[RequestPayload],
476+
RequestHeader,
477+
ResponsePayload,
478+
ResponseHeader,
479+
>,
480+
>,
481+
ReceiveError,
482+
> {
483+
todo!()
484+
}
485+
}

iceoryx2/src/request_mut_uninit.rs

+61-8
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ use core::{fmt::Debug, mem::MaybeUninit};
4848
#[repr(transparent)]
4949
pub struct RequestMutUninit<
5050
Service: crate::service::Service,
51-
RequestPayload: Debug + ZeroCopySend,
51+
RequestPayload: Debug + ZeroCopySend + ?Sized,
5252
RequestHeader: Debug + ZeroCopySend,
53-
ResponsePayload: Debug + ZeroCopySend,
53+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
5454
ResponseHeader: Debug + ZeroCopySend,
5555
> {
5656
pub(crate) request:
@@ -59,9 +59,9 @@ pub struct RequestMutUninit<
5959

6060
impl<
6161
Service: crate::service::Service,
62-
RequestPayload: Debug + ZeroCopySend,
62+
RequestPayload: Debug + ZeroCopySend + ?Sized,
6363
RequestHeader: Debug + ZeroCopySend,
64-
ResponsePayload: Debug + ZeroCopySend,
64+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
6565
ResponseHeader: Debug + ZeroCopySend,
6666
> Debug
6767
for RequestMutUninit<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
@@ -73,9 +73,9 @@ impl<
7373

7474
impl<
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
> RequestMutUninit<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
8181
{
@@ -108,9 +108,9 @@ impl<
108108

109109
impl<
110110
Service: crate::service::Service,
111-
RequestPayload: Debug + ZeroCopySend,
111+
RequestPayload: Debug + ZeroCopySend + Sized,
112112
RequestHeader: Debug + ZeroCopySend,
113-
ResponsePayload: Debug + ZeroCopySend,
113+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
114114
ResponseHeader: Debug + ZeroCopySend,
115115
>
116116
RequestMutUninit<
@@ -172,3 +172,56 @@ impl<
172172
core::mem::transmute(self.request)
173173
}
174174
}
175+
176+
impl<
177+
Service: crate::service::Service,
178+
RequestPayload: Debug + ZeroCopySend,
179+
RequestHeader: Debug + ZeroCopySend,
180+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
181+
ResponseHeader: Debug + ZeroCopySend,
182+
>
183+
RequestMutUninit<
184+
Service,
185+
[MaybeUninit<RequestPayload>],
186+
RequestHeader,
187+
ResponsePayload,
188+
ResponseHeader,
189+
>
190+
{
191+
pub unsafe fn assume_init(
192+
self,
193+
) -> RequestMut<Service, [RequestPayload], RequestHeader, ResponsePayload, ResponseHeader> {
194+
// the transmute is not nice but safe since MaybeUninit is #[repr(transparent)] to the inner type
195+
core::mem::transmute(self.request)
196+
}
197+
198+
pub fn write_from_fn<F: FnMut(usize) -> ResponsePayload>(
199+
mut self,
200+
mut initializer: F,
201+
) -> RequestMut<Service, [RequestPayload], RequestHeader, ResponsePayload, ResponseHeader> {
202+
todo!()
203+
}
204+
}
205+
206+
impl<
207+
Service: crate::service::Service,
208+
RequestPayload: Debug + ZeroCopySend,
209+
RequestHeader: Debug + ZeroCopySend,
210+
ResponsePayload: Debug + Copy + ZeroCopySend + ?Sized,
211+
ResponseHeader: Debug + ZeroCopySend,
212+
>
213+
RequestMutUninit<
214+
Service,
215+
[MaybeUninit<RequestPayload>],
216+
RequestHeader,
217+
ResponsePayload,
218+
ResponseHeader,
219+
>
220+
{
221+
pub fn write_from_slice(
222+
mut self,
223+
value: &[RequestPayload],
224+
) -> RequestMut<Service, [RequestPayload], RequestHeader, ResponsePayload, ResponseHeader> {
225+
todo!()
226+
}
227+
}

iceoryx2/src/service/port_factory/client.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ impl core::error::Error for ClientCreateError {}
6767
pub struct PortFactoryClient<
6868
'factory,
6969
Service: service::Service,
70-
RequestPayload: Debug + ZeroCopySend,
70+
RequestPayload: Debug + ZeroCopySend + ?Sized,
7171
RequestHeader: Debug + ZeroCopySend,
72-
ResponsePayload: Debug + ZeroCopySend,
72+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
7373
ResponseHeader: Debug + ZeroCopySend,
7474
> {
7575
pub(crate) factory: &'factory PortFactory<
@@ -87,9 +87,9 @@ pub struct PortFactoryClient<
8787
impl<
8888
'factory,
8989
Service: service::Service,
90-
RequestPayload: Debug + ZeroCopySend,
90+
RequestPayload: Debug + ZeroCopySend + ?Sized,
9191
RequestHeader: Debug + ZeroCopySend,
92-
ResponsePayload: Debug + ZeroCopySend,
92+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
9393
ResponseHeader: Debug + ZeroCopySend,
9494
>
9595
PortFactoryClient<

iceoryx2/src/service/port_factory/request_response.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ use super::{client::PortFactoryClient, nodes, server::PortFactoryServer};
6161
#[derive(Debug)]
6262
pub struct PortFactory<
6363
Service: service::Service,
64-
RequestPayload: Debug + ZeroCopySend,
64+
RequestPayload: Debug + ZeroCopySend + ?Sized,
6565
RequestHeader: Debug + ZeroCopySend,
66-
ResponsePayload: Debug + ZeroCopySend,
66+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
6767
ResponseHeader: Debug + ZeroCopySend,
6868
> {
6969
pub(crate) service: Service,
@@ -75,9 +75,9 @@ pub struct PortFactory<
7575

7676
unsafe impl<
7777
Service: service::Service,
78-
RequestPayload: Debug + ZeroCopySend,
78+
RequestPayload: Debug + ZeroCopySend + ?Sized,
7979
RequestHeader: Debug + ZeroCopySend,
80-
ResponsePayload: Debug + ZeroCopySend,
80+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
8181
ResponseHeader: Debug + ZeroCopySend,
8282
> Send
8383
for PortFactory<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
@@ -96,9 +96,9 @@ unsafe impl<
9696

9797
impl<
9898
Service: 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
> crate::service::port_factory::PortFactory
104104
for PortFactory<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
@@ -148,9 +148,9 @@ impl<
148148

149149
impl<
150150
Service: service::Service,
151-
RequestPayload: Debug + ZeroCopySend,
151+
RequestPayload: Debug + ZeroCopySend + ?Sized,
152152
RequestHeader: Debug + ZeroCopySend,
153-
ResponsePayload: Debug + ZeroCopySend,
153+
ResponsePayload: Debug + ZeroCopySend + ?Sized,
154154
ResponseHeader: Debug + ZeroCopySend,
155155
> PortFactory<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
156156
{

0 commit comments

Comments
 (0)