iceoryx2
C++ Bindings
Loading...
Searching...
No Matches
request_mut_uninit.hpp
Go to the documentation of this file.
1// Copyright (c) 2025 Contributors to the Eclipse Foundation
2//
3// See the NOTICE file(s) distributed with this work for additional
4// information regarding copyright ownership.
5//
6// This program and the accompanying materials are made available under the
7// terms of the Apache Software License 2.0 which is available at
8// https://www.apache.org/licenses/LICENSE-2.0, or the MIT license
9// which is available at https://opensource.org/licenses/MIT.
10//
11// SPDX-License-Identifier: Apache-2.0 OR MIT
12
13#ifndef IOX2_REQUEST_MUT_UNINIT_HPP
14#define IOX2_REQUEST_MUT_UNINIT_HPP
15
17#include "iox2/deployment/iceoryx2_cxx_feature_flags.hpp"
20#include "iox2/request_mut.hpp"
21#include "iox2/service_type.hpp"
22
23#if IOX2_FEATURE_FLATBUFFERS
25
26#include <flatbuffers/buffer.h>
27#include <flatbuffers/flatbuffer_builder.h>
28#endif // IOX2_FEATURE_FLATBUFFERS
29
30namespace iox2 {
31
35template <ServiceType Service,
36 typename RequestPayload,
37 typename RequestUserHeader,
38 typename ResponsePayload,
39 typename ResponseUserHeader>
41 using ValueType = typename PayloadInfo<RequestPayload>::ValueType;
42
43 public:
44 RequestMutUninit(RequestMutUninit&& rhs) noexcept = default;
45 auto operator=(RequestMutUninit&& rhs) noexcept -> RequestMutUninit& = default;
46 ~RequestMutUninit() noexcept = default;
47
49 auto operator=(const RequestMutUninit&) -> RequestMutUninit& = delete;
50
52 template <typename T = RequestPayload, typename = std::enable_if_t<!has_flatbuffer_marker<T>(), void>>
53 auto header() const -> RequestHeader;
54
56 template <
57 typename T = RequestUserHeader,
58 typename U = RequestPayload,
59 typename = std::enable_if_t<!std::is_same<void, RequestUserHeader>::value && !has_flatbuffer_marker<U>(), void>>
60 auto user_header() const -> const T&;
61
63 template <
64 typename T = RequestUserHeader,
65 typename U = RequestPayload,
66 typename = std::enable_if_t<!std::is_same<void, RequestUserHeader>::value && !has_flatbuffer_marker<U>(), void>>
67 auto user_header_mut() -> T&;
68
70 template <typename T = RequestPayload,
71 typename = std::enable_if_t<!bb::IsSlice<T>::VALUE && !has_flatbuffer_marker<T>(), void>>
72 auto payload() const -> const RequestPayload&;
73
75 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
76 auto payload() const -> bb::ImmutableSlice<ValueType>;
77
79 template <typename T = RequestPayload,
80 typename = std::enable_if_t<!bb::IsSlice<T>::VALUE && !has_flatbuffer_marker<T>(), void>>
81 auto payload_mut() -> RequestPayload&;
82
84 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
85 auto payload_mut() -> bb::MutableSlice<ValueType>;
86
89 template <typename T = RequestPayload,
90 typename = std::enable_if_t<!bb::IsSlice<T>::VALUE && !has_flatbuffer_marker<T>(), T>>
91 auto write_payload(RequestPayload&& payload)
92 -> RequestMut<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>;
93
96 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, T>>
97 auto write_from_slice(bb::ImmutableSlice<ValueType>& value)
98 -> RequestMut<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>;
99
102 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, T>>
103 auto write_from_fn(const iox2::bb::StaticFunction<typename T::ValueType(uint64_t)>& initializer)
104 -> RequestMut<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>;
105
106#if IOX2_FEATURE_FLATBUFFERS
109 template <typename T = RequestPayload, typename = std::enable_if_t<has_flatbuffer_marker<T>(), T>>
110 auto flatbuffer_builder() -> flatbuffers::FlatBufferBuilder&;
111#endif // IOX2_FEATURE_FLATBUFFERS
112
113 private:
114 template <ServiceType, typename, typename, typename, typename>
115 friend class Client;
116
117 explicit RequestMutUninit() = default;
118
119 auto get_handle() -> iox2_request_mut_h;
120
121 template <ServiceType S,
122 typename RequestPayloadT,
123 typename RequestUserHeaderT,
124 typename ResponsePayloadT,
125 typename ResponseUserHeaderT>
126 friend auto
129
130#if IOX2_FEATURE_FLATBUFFERS
131 template <ServiceType S,
132 typename RequestPayloadT,
133 typename RequestUserHeaderT,
134 typename ResponsePayloadT,
135 typename ResponseUserHeaderT>
136 friend auto assume_init(
137 RequestMutUninit<S, Flatbuffer<RequestPayloadT>, RequestUserHeaderT, ResponsePayloadT, ResponseUserHeaderT>&&
138 self,
139 flatbuffers::Offset<RequestPayloadT>)
140 -> RequestMut<S, Flatbuffer<RequestPayloadT>, RequestUserHeaderT, ResponsePayloadT, ResponseUserHeaderT>;
141#endif // IOX2_FEATURE_FLATBUFFERS
142
143
144#if IOX2_FEATURE_FLATBUFFERS
147#endif // IOX2_FEATURE_FLATBUFFERS
149};
150
151template <ServiceType Service,
152 typename RequestPayload,
153 typename RequestUserHeader,
154 typename ResponsePayload,
155 typename ResponseUserHeader>
156template <typename T, typename>
157inline auto
162
163template <ServiceType Service,
164 typename RequestPayload,
165 typename RequestUserHeader,
166 typename ResponsePayload,
167 typename ResponseUserHeader>
168template <typename T, typename U, typename>
169inline auto
171 -> const T& {
172 return m_request.template user_header<T>();
173}
174
175template <ServiceType Service,
176 typename RequestPayload,
177 typename RequestUserHeader,
178 typename ResponsePayload,
179 typename ResponseUserHeader>
180template <typename T, typename U, typename>
181inline auto
186
187template <ServiceType Service,
188 typename RequestPayload,
189 typename RequestUserHeader,
190 typename ResponsePayload,
191 typename ResponseUserHeader>
192template <typename T, typename>
193inline auto
195 -> const RequestPayload& {
196 return m_request.payload();
197}
198
199template <ServiceType Service,
200 typename RequestPayload,
201 typename RequestUserHeader,
202 typename ResponsePayload,
203 typename ResponseUserHeader>
204template <typename T, typename>
205inline auto
207 -> bb::ImmutableSlice<ValueType> {
208 return m_request.payload();
209}
210
211template <ServiceType Service,
212 typename RequestPayload,
213 typename RequestUserHeader,
214 typename ResponsePayload,
215 typename ResponseUserHeader>
216template <typename T, typename>
217inline auto
222
223template <ServiceType Service,
224 typename RequestPayload,
225 typename RequestUserHeader,
226 typename ResponsePayload,
227 typename ResponseUserHeader>
228template <typename T, typename>
229inline auto
232 return m_request.payload_mut();
233}
234
235template <ServiceType Service,
236 typename RequestPayload,
237 typename RequestUserHeader,
238 typename ResponsePayload,
239 typename ResponseUserHeader>
240template <typename T, typename>
241inline auto
243 RequestPayload&& payload)
245 new (&payload_mut()) RequestPayload(std::forward<T>(payload));
246 return std::move(m_request);
247}
248
249template <ServiceType Service,
250 typename RequestPayload,
251 typename RequestUserHeader,
252 typename ResponsePayload,
253 typename ResponseUserHeader>
254template <typename T, typename>
255inline auto
259 auto dest = payload_mut();
260 IOX2_ASSERT(dest.number_of_bytes() >= value.number_of_bytes(),
261 "Destination payload size is smaller than source slice size");
262 std::memcpy(dest.begin(), value.begin(), value.number_of_bytes());
263 return std::move(m_request);
264}
265
266template <ServiceType Service,
267 typename RequestPayload,
268 typename RequestUserHeader,
269 typename ResponsePayload,
270 typename ResponseUserHeader>
271template <typename T, typename>
272inline auto
274 const iox2::bb::StaticFunction<typename T::ValueType(uint64_t)>& initializer)
276 auto slice = payload_mut();
277 for (uint64_t i = 0; i < slice.number_of_elements(); ++i) {
278 new (&slice[i]) typename T::ValueType(initializer(i));
279 }
280 return std::move(m_request);
281}
282
283template <ServiceType Service,
284 typename RequestPayload,
285 typename RequestUserHeader,
286 typename ResponsePayload,
287 typename ResponseUserHeader>
288inline auto
293
294#if IOX2_FEATURE_FLATBUFFERS
295template <ServiceType Service,
296 typename RequestPayload,
297 typename RequestUserHeader,
298 typename ResponsePayload,
299 typename ResponseUserHeader>
300template <typename T, typename>
302 flatbuffer_builder() -> flatbuffers::FlatBufferBuilder& {
303 return m_flatbuffer_builder.value();
304}
305
306template <ServiceType Service,
307 typename RequestPayload,
308 typename RequestUserHeader,
309 typename ResponsePayload,
310 typename ResponseUserHeader>
311inline auto assume_init(
312 RequestMutUninit<Service, Flatbuffer<RequestPayload>, RequestUserHeader, ResponsePayload, ResponseUserHeader>&&
313 self,
314 flatbuffers::Offset<RequestPayload> root)
315 -> RequestMut<Service, Flatbuffer<RequestPayload>, RequestUserHeader, ResponsePayload, ResponseUserHeader> {
316 self.flatbuffer_builder().Finish(root, nullptr);
317 const auto* payload_ptr = self.flatbuffer_builder().GetBufferPointer();
318 auto handle = self.get_handle();
319 iox2_request_mut_finish_serialized(&handle, payload_ptr);
320 // must be the last statement since `iox2_request_mut_finish_serialized` updates the
321 // header and user header ptrs when the flatbuffer builder has resized the memory
323
324 return std::move(self.m_request);
325}
326#endif // IOX2_FEATURE_FLATBUFFERS
327
328template <ServiceType Service,
329 typename RequestPayload,
330 typename RequestUserHeader,
331 typename ResponsePayload,
332 typename ResponseUserHeader>
333inline auto
334RequestMutUninit<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>::get_handle()
335 -> iox2_request_mut_h {
336 return m_request.m_handle;
337}
338} // namespace iox2
339
340#endif
#define IOX2_ASSERT(condition, message)
only for debug builds: report fatal assert violation if expression evaluates to false
Sends [RequestMut]s to a [Server] in a request-response based communication.
Definition client.hpp:33
Request header used by [MessagingPattern::RequestResponse].
~RequestMutUninit() noexcept=default
auto write_from_slice(bb::ImmutableSlice< ValueType > &value) -> RequestMut< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >
auto write_from_fn(const iox2::bb::StaticFunction< typename T::ValueType(uint64_t)> &initializer) -> RequestMut< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >
auto payload_mut() -> RequestPayload &
Returns a mutable reference to the user defined request payload.
auto user_header_mut() -> T &
Returns a mutable reference to the user defined request header.
RequestMutUninit(RequestMutUninit &&rhs) noexcept=default
auto write_payload(RequestPayload &&payload) -> RequestMut< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >
auto payload() const -> const RequestPayload &
Returns a reference to the user defined request payload.
friend auto assume_init(RequestMutUninit< S, RequestPayloadT, RequestUserHeaderT, ResponsePayloadT, ResponseUserHeaderT > &&self) -> RequestMut< S, RequestPayloadT, RequestUserHeaderT, ResponsePayloadT, ResponseUserHeaderT >
friend auto assume_init(RequestMutUninit< S, Flatbuffer< RequestPayloadT >, RequestUserHeaderT, ResponsePayloadT, ResponseUserHeaderT > &&self, flatbuffers::Offset< RequestPayloadT >) -> RequestMut< S, Flatbuffer< RequestPayloadT >, RequestUserHeaderT, ResponsePayloadT, ResponseUserHeaderT >
auto user_header() const -> const T &
Returns a reference to the user defined request header.
auto flatbuffer_builder() -> flatbuffers::FlatBufferBuilder &
auto header() const -> RequestHeader
Returns a reference to the iceoryx2 internal [RequestHeader].
auto operator=(RequestMutUninit &&rhs) noexcept -> RequestMutUninit &=default
A class representing a slice of contiguous elements of type T.
Definition slice.hpp:31
Internal helper class to handle dynamic memory allocations used in e.g. flatbuffers.
iox2::bb::variation::Optional< T > Optional
Definition optional.hpp:25
constexpr auto has_flatbuffer_marker() -> bool
Definition marker.hpp:53
auto assume_init(RequestMutUninit< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader > &&self) -> RequestMut< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >
Identifies payloads that are serialized via flatbuffer.
Definition marker.hpp:24
static void placement_default(S &payload)
Definition helper.hpp:22