@@ -188,13 +188,83 @@ impl<
188
188
ResponseHeader ,
189
189
>
190
190
{
191
+ /// When the payload is manually populated by using
192
+ /// [`RequestMutUninit::payload_mut()`], then this function can be used
193
+ /// to convert it into the initialized [`RequestMut`] version.
194
+ ///
195
+ /// # Example
196
+ ///
197
+ /// ```
198
+ /// use iceoryx2::prelude::*;
199
+ ///
200
+ /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
201
+ /// # let node = NodeBuilder::new().create::<ipc::Service>()?;
202
+ /// #
203
+ /// let service = node
204
+ /// .service_builder(&"My/Funk/ServiceName".try_into()?)
205
+ /// .request_response::<[u64], u64>()
206
+ /// .open_or_create()?;
207
+ ///
208
+ /// let client = service.client_builder()
209
+ /// .initial_max_slice_len(32)
210
+ /// .create()?;
211
+ ///
212
+ /// let slice_length = 13;
213
+ /// let mut request = client.loan_slice_uninit(slice_length)?;
214
+ /// for element in request.payload_mut() {
215
+ /// element.write(1234);
216
+ /// }
217
+ /// // we have written the payload, initialize the request
218
+ /// let request = unsafe { request.assume_init() };
219
+ ///
220
+ /// let pending_response = request.send()?;
221
+ ///
222
+ /// # Ok(())
223
+ /// # }
224
+ /// ```
225
+ /// # Safety
226
+ ///
227
+ /// The caller must ensure that [`core::mem::MaybeUninit<Payload>`] really is initialized.
228
+ /// Sending the content when it is not fully initialized causes immediate undefined behavior.
191
229
pub unsafe fn assume_init (
192
230
self ,
193
231
) -> RequestMut < Service , [ RequestPayload ] , RequestHeader , ResponsePayload , ResponseHeader > {
194
232
// the transmute is not nice but safe since MaybeUninit is #[repr(transparent)] to the inner type
195
233
core:: mem:: transmute ( self . request )
196
234
}
197
235
236
+ /// Writes the payload to the [`RequestMutUninit`] and labels the [`RequestMutUninit`] as
237
+ /// initialized
238
+ ///
239
+ /// # Example
240
+ ///
241
+ /// ```
242
+ /// use iceoryx2::prelude::*;
243
+ ///
244
+ /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
245
+ /// # let node = NodeBuilder::new().create::<ipc::Service>()?;
246
+ /// #
247
+ /// let service = node
248
+ /// .service_builder(&"My/Funk/ServiceName".try_into()?)
249
+ /// .request_response::<[u64], u64>()
250
+ /// .open_or_create()?;
251
+ ///
252
+ /// let client = service.client_builder()
253
+ /// .initial_max_slice_len(32)
254
+ /// .create()?;
255
+ ///
256
+ /// let slice_length = 13;
257
+ /// let mut request = client.loan_slice_uninit(slice_length)?;
258
+ /// for element in request.payload_mut() {
259
+ /// element.write(1234);
260
+ /// }
261
+ /// let request = unsafe { request.assume_init() };
262
+ ///
263
+ /// let pending_response = request.send()?;
264
+ ///
265
+ /// # Ok(())
266
+ /// # }
267
+ /// ```
198
268
pub fn write_from_fn < F : FnMut ( usize ) -> RequestPayload > (
199
269
mut self ,
200
270
mut initializer : F ,
@@ -223,6 +293,34 @@ impl<
223
293
ResponseHeader ,
224
294
>
225
295
{
296
+ /// Writes the payload by mem copying the provided slice into the [`RequestMutUninit`].
297
+ ///
298
+ /// # Example
299
+ ///
300
+ /// ```
301
+ /// use iceoryx2::prelude::*;
302
+ ///
303
+ /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
304
+ /// # let node = NodeBuilder::new().create::<ipc::Service>()?;
305
+ /// #
306
+ /// let service = node
307
+ /// .service_builder(&"My/Funk/ServiceName".try_into()?)
308
+ /// .request_response::<[u64], u64>()
309
+ /// .open_or_create()?;
310
+ ///
311
+ /// let client = service.client_builder()
312
+ /// .initial_max_slice_len(32)
313
+ /// .create()?;
314
+ ///
315
+ /// let slice_length = 3;
316
+ /// let mut request = client.loan_slice_uninit(slice_length)?;
317
+ /// let request = request.write_from_slice(&vec![1,2,3]);
318
+ ///
319
+ /// let pending_response = request.send()?;
320
+ ///
321
+ /// # Ok(())
322
+ /// # }
323
+ /// ```
226
324
pub fn write_from_slice (
227
325
mut self ,
228
326
value : & [ RequestPayload ] ,
0 commit comments