13#ifndef IOX2_ACTIVE_REQUEST_HPP
14#define IOX2_ACTIVE_REQUEST_HPP
32 typename RequestPayload,
33 typename RequestUserHeader,
34 typename ResponsePayload,
35 typename ResponseUserHeader>
48 template <typename T = ResponsePayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
52 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
58 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
63 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
67 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
68 auto payload() const -> const T&;
71 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
72 auto
payload() const -> bb::ImmutableSlice<ValueType>;
75 template <typename T = RequestUserHeader,
76 typename = std::enable_if_t<!std::is_same<
void, RequestUserHeader>::value, T>>
97 template <typename T = ResponsePayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
102 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
107 template <
ServiceType, typename, typename, typename, typename>
110 explicit
ActiveRequest(iox2_active_request_h handle) noexcept;
114 iox2_active_request_h m_handle =
nullptr;
118 typename RequestPayload,
119 typename RequestUserHeader,
120 typename ResponsePayload,
121 typename ResponseUserHeader>
124 *
this = std::move(rhs);
128 typename RequestPayload,
129 typename RequestUserHeader,
130 typename ResponsePayload,
131 typename ResponseUserHeader>
136 m_handle = rhs.m_handle;
137 rhs.m_handle =
nullptr;
144 typename RequestPayload,
145 typename RequestUserHeader,
146 typename ResponsePayload,
147 typename ResponseUserHeader>
154 typename RequestPayload,
155 typename RequestUserHeader,
156 typename ResponsePayload,
157 typename ResponseUserHeader>
158template <
typename T,
typename>
162 constexpr uint64_t NUMBER_OF_ELEMENTS = 1;
164 auto result = iox2_active_request_loan_slice_uninit(
165 &m_handle, &response.m_response.m_response, &response.m_response.m_handle, NUMBER_OF_ELEMENTS);
167 if (result == IOX2_OK) {
170 return bb::err(bb::into<LoanError>(result));
174 typename RequestPayload,
175 typename RequestUserHeader,
176 typename ResponsePayload,
177 typename ResponseUserHeader>
178template <
typename T,
typename>
181 uint64_t number_of_elements)
184 auto result = iox2_active_request_loan_slice_uninit(
185 &m_handle, &response.m_response.m_response, &response.m_response.m_handle, number_of_elements);
187 if (result == IOX2_OK) {
190 return bb::err(bb::into<LoanError>(result));
194 typename RequestPayload,
195 typename RequestUserHeader,
196 typename ResponsePayload,
197 typename ResponseUserHeader>
198template <
typename T,
typename>
201 static_assert(std::is_trivially_copyable<ResponsePayload>::value,
202 "The server supports only trivially copyable response payload types.");
203 constexpr uint64_t NUMBER_OF_ELEMENTS = 1;
205 auto result = iox2_active_request_send_copy(
206 &m_handle,
static_cast<const void*
>(&
payload),
sizeof(ResponsePayload), NUMBER_OF_ELEMENTS);
207 if (result == IOX2_OK) {
210 return bb::err(bb::into<SendError>(result));
214 typename RequestPayload,
215 typename RequestUserHeader,
216 typename ResponsePayload,
217 typename ResponseUserHeader>
218template <
typename T,
typename>
222 static_assert(std::is_trivially_copyable<ValueType>::value,
223 "The server supports only trivially copyable response payload types.");
225 auto result = iox2_active_request_send_copy(
226 &m_handle,
payload.data(),
sizeof(
typename ResponsePayload::ValueType),
payload.number_of_elements());
227 if (result == IOX2_OK) {
230 return bb::err(bb::into<SendError>(result));
234 typename RequestPayload,
235 typename RequestUserHeader,
236 typename ResponsePayload,
237 typename ResponseUserHeader>
238template <
typename T,
typename>
242 const void* ptr =
nullptr;
243 iox2_active_request_payload(&m_handle, &ptr,
nullptr);
244 return *
static_cast<const T*
>(ptr);
248 typename RequestPayload,
249 typename RequestUserHeader,
250 typename ResponsePayload,
251 typename ResponseUserHeader>
252template <
typename T,
typename>
255 -> bb::ImmutableSlice<ValueType> {
256 const void* ptr =
nullptr;
257 size_t number_of_elements = 0;
259 iox2_active_request_payload(&m_handle, &ptr, &number_of_elements);
263 auto length = number_of_elements;
264 if (std::is_same<ValueType, CustomPayloadMarker>::value) {
265 length = iox2_active_request_payload_number_of_bytes(&m_handle);
268 return bb::ImmutableSlice<ValueType>(
static_cast<const ValueType*
>(ptr), length);
272 typename RequestPayload,
273 typename RequestUserHeader,
274 typename ResponsePayload,
275 typename ResponseUserHeader>
276template <
typename T,
typename>
280 const void* ptr =
nullptr;
281 iox2_active_request_user_header(&m_handle, &ptr);
282 return *
static_cast<const T*
>(ptr);
286 typename RequestPayload,
287 typename RequestUserHeader,
288 typename ResponsePayload,
289 typename ResponseUserHeader>
293 iox2_request_header_h header_handle =
nullptr;
294 iox2_active_request_header(&m_handle,
nullptr, &header_handle);
299 typename RequestPayload,
300 typename RequestUserHeader,
301 typename ResponsePayload,
302 typename ResponseUserHeader>
306 return header().client_port_id();
310 typename RequestPayload,
311 typename RequestUserHeader,
312 typename ResponsePayload,
313 typename ResponseUserHeader>
317 return iox2_active_request_is_connected(&m_handle);
321 typename RequestPayload,
322 typename RequestUserHeader,
323 typename ResponsePayload,
324 typename ResponseUserHeader>
328 return iox2_active_request_has_disconnect_hint(&m_handle);
332 typename RequestPayload,
333 typename RequestUserHeader,
334 typename ResponsePayload,
335 typename ResponseUserHeader>
336template <
typename T,
typename>
340 if (!response.has_value()) {
341 return bb::err(response.error());
344 new (&response->payload_mut()) ResponsePayload();
349 typename RequestPayload,
350 typename RequestUserHeader,
351 typename ResponsePayload,
352 typename ResponseUserHeader>
353template <
typename T,
typename>
357 if (!response_uninit.has_value()) {
358 return bb::err(response_uninit.error());
361 auto response_init = std::move(response_uninit.value());
362 for (
auto& item : response_init.payload_mut()) {
363 new (&item) ValueType();
370 typename RequestPayload,
371 typename RequestUserHeader,
372 typename ResponsePayload,
373 typename ResponseUserHeader>
375 iox2_active_request_h handle) noexcept
380 typename RequestPayload,
381 typename RequestUserHeader,
382 typename ResponsePayload,
383 typename ResponseUserHeader>
384inline void ActiveRequest<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>::drop() {
385 if (m_handle !=
nullptr) {
386 iox2_active_request_drop(m_handle);
auto operator=(const ActiveRequest &) noexcept -> ActiveRequest &=delete
auto loan_uninit() -> bb::Expected< ResponseMutUninit< Service, ResponsePayload, ResponseUserHeader >, LoanError >
Loans uninitialized memory for a [ResponseMutUninit] where the user can write its payload to.
auto origin() const -> UniqueClientId
Returns the [UniqueClientId] of the [Client].
auto is_connected() const -> bool
auto header() const -> RequestHeader
Returns a reference to the [RequestHeader] of the received [RequestMut].
auto has_disconnect_hint() const -> bool
auto loan() -> bb::Expected< ResponseMut< Service, ResponsePayload, ResponseUserHeader >, LoanError >
auto user_header() const -> const T &
Returns a reference to the user_header of the received [RequestMut].
auto loan_slice_uninit(uint64_t number_of_elements) -> bb::Expected< ResponseMutUninit< Service, ResponsePayload, ResponseUserHeader >, LoanError >
Loans uninitialized memory for a [ResponseMutUninit] where the user can write its payload to.
auto send_slice_copy(const bb::ImmutableSlice< ValueType > &payload) const -> bb::Expected< void, SendError >
auto loan_slice(uint64_t number_of_elements) -> bb::Expected< ResponseMut< Service, ResponsePayload, ResponseUserHeader >, LoanError >
auto send_copy(const ResponsePayload &payload) const -> bb::Expected< void, SendError >
ActiveRequest(const ActiveRequest &)=delete
~ActiveRequest() noexcept
ActiveRequest(ActiveRequest &&rhs) noexcept
auto payload() const -> const T &
Returns a reference to the payload of the received [RequestMut].
auto operator=(ActiveRequest &&rhs) noexcept -> ActiveRequest &
The system-wide unique id of a [Client].
A class representing a slice of contiguous elements of type T.
constexpr auto err(const E &error) -> Unexpected< E >
iox2::bb::variation::Expected< T, E > Expected
auto assume_init(RequestMutUninit< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader > &&self) -> RequestMut< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >
static void placement_default(S &payload)