13#ifndef IOX2_CLIENT_HPP
14#define IOX2_CLIENT_HPP
28 typename RequestPayload,
29 typename RequestUserHeader,
30 typename ResponsePayload,
31 typename ResponseUserHeader>
57 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>>
64 auto
send_copy(const RequestPayload& payload) const -> bb::Expected<
71 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
72 auto
send_slice_copy(bb::ImmutableSlice<ValueType>& payload) const -> bb::Expected<
78 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
85 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
93 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
100 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
105 template <
ServiceType, typename, typename, typename, typename>
108 explicit
Client(iox2_client_h handle) noexcept;
112 iox2_client_h m_handle =
nullptr;
116 typename RequestPayload,
117 typename RequestUserHeader,
118 typename ResponsePayload,
119 typename ResponseUserHeader>
122 *
this = std::move(rhs);
126 typename RequestPayload,
127 typename RequestUserHeader,
128 typename ResponsePayload,
129 typename ResponseUserHeader>
134 m_handle = rhs.m_handle;
135 rhs.m_handle =
nullptr;
142 typename RequestPayload,
143 typename RequestUserHeader,
144 typename ResponsePayload,
145 typename ResponseUserHeader>
151 typename RequestPayload,
152 typename RequestUserHeader,
153 typename ResponsePayload,
154 typename ResponseUserHeader>
157 iox2_unique_client_id_h id_handle =
nullptr;
158 iox2_client_id(&m_handle,
nullptr, &id_handle);
163 typename RequestPayload,
165 typename ResponsePayload,
169 const auto* port_name_ptr = iox2_client_name(&m_handle);
174 typename RequestPayload,
175 typename RequestUserHeader,
176 typename ResponsePayload,
177 typename ResponseUserHeader>
181 return iox2::bb::into<BackpressureStrategy>(
static_cast<int>(iox2_client_backpressure_strategy(&m_handle)));
185 typename RequestPayload,
186 typename RequestUserHeader,
187 typename ResponsePayload,
188 typename ResponseUserHeader>
192 return iox2_client_max_active_requests(&m_handle);
196 typename RequestPayload,
197 typename RequestUserHeader,
198 typename ResponsePayload,
199 typename ResponseUserHeader>
200template <
typename T,
typename>
204 return iox2_client_initial_max_slice_len(&m_handle);
208 typename RequestPayload,
209 typename RequestUserHeader,
210 typename ResponsePayload,
211 typename ResponseUserHeader>
212template <
typename T,
typename>
216 constexpr uint64_t NUMBER_OF_ELEMENTS = 1;
218 auto result = iox2_client_loan_slice_uninit(
219 &m_handle, &request.m_request.m_request, &request.m_request.m_handle, NUMBER_OF_ELEMENTS);
221 if (result == IOX2_OK) {
224 return bb::err(bb::into<LoanError>(result));
228 typename RequestPayload,
229 typename RequestUserHeader,
230 typename ResponsePayload,
231 typename ResponseUserHeader>
232template <
typename T,
typename>
234 uint64_t number_of_elements)
237 auto result = iox2_client_loan_slice_uninit(
238 &m_handle, &request.m_request.m_request, &request.m_request.m_handle, number_of_elements);
240 if (result == IOX2_OK) {
243 return bb::err(bb::into<LoanError>(result));
247 typename RequestPayload,
248 typename RequestUserHeader,
249 typename ResponsePayload,
250 typename ResponseUserHeader>
251template <
typename T,
typename>
253 const RequestPayload& payload)
const
256 static_assert(std::is_trivially_copyable<RequestPayload>::value,
257 "The client supports only trivially copyable request payload types.");
259 iox2_pending_response_h pending_response_handle {};
260 auto result = iox2_client_send_copy(
261 &m_handle,
static_cast<const void*
>(&payload),
sizeof(RequestPayload), 1,
nullptr, &pending_response_handle);
263 if (result == IOX2_OK) {
265 pending_response_handle);
268 return bb::err(bb::into<RequestSendError>(result));
272 typename RequestPayload,
273 typename RequestUserHeader,
274 typename ResponsePayload,
275 typename ResponseUserHeader>
276template <
typename T,
typename>
281 static_assert(std::is_trivially_copyable<ValueType>::value,
282 "The client supports only trivially copyable request payload types.");
284 iox2_pending_response_h pending_response_handle {};
285 auto result = iox2_client_send_copy(&m_handle,
287 sizeof(
typename RequestPayload::ValueType),
288 payload.number_of_elements(),
290 &pending_response_handle);
292 if (result == IOX2_OK) {
294 pending_response_handle);
297 return bb::err(bb::into<RequestSendError>(result));
301 typename RequestPayload,
302 typename RequestUserHeader,
303 typename ResponsePayload,
304 typename ResponseUserHeader>
305template <
typename T,
typename>
309 if (!request.has_value()) {
310 return bb::err(request.error());
313 new (&request->payload_mut()) RequestPayload();
318 typename RequestPayload,
319 typename RequestUserHeader,
320 typename ResponsePayload,
321 typename ResponseUserHeader>
322template <
typename T,
typename>
324 uint64_t number_of_elements)
327 if (!request_uninit.has_value()) {
328 return bb::err(request_uninit.error());
331 auto request_init = std::move(request_uninit.value());
332 for (
auto& item : request_init.payload_mut()) {
333 new (&item) ValueType();
340 typename RequestPayload,
341 typename RequestUserHeader,
342 typename ResponsePayload,
343 typename ResponseUserHeader>
345 iox2_client_h handle) noexcept
346 : m_handle { handle } {
350 typename RequestPayload,
351 typename RequestUserHeader,
352 typename ResponsePayload,
353 typename ResponseUserHeader>
354inline void Client<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>::drop() {
355 if (m_handle !=
nullptr) {
356 iox2_client_drop(m_handle);
Sends [RequestMut]s to a [Server] in a request-response based communication.
auto loan_slice_uninit(uint64_t number_of_elements) -> bb::Expected< RequestMutUninit< Service, T, RequestUserHeader, ResponsePayload, ResponseUserHeader >, LoanError >
Client(const Client &) noexcept=delete
auto backpressure_strategy() const -> BackpressureStrategy
auto loan_slice(uint64_t number_of_elements) -> bb::Expected< RequestMut< Service, T, RequestUserHeader, ResponsePayload, ResponseUserHeader >, LoanError >
auto send_slice_copy(bb::ImmutableSlice< ValueType > &payload) const -> bb::Expected< PendingResponse< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, RequestSendError >
Client(Client &&rhs) noexcept
auto operator=(const Client &) noexcept -> Client &=delete
auto loan_uninit() -> bb::Expected< RequestMutUninit< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, LoanError >
auto loan() -> bb::Expected< RequestMut< Service, T, RequestUserHeader, ResponsePayload, ResponseUserHeader >, LoanError >
auto send_copy(const RequestPayload &payload) const -> bb::Expected< PendingResponse< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, RequestSendError >
auto name() const -> PortNameView
Returns the [PortNameView] of the [Client].
auto operator=(Client &&rhs) noexcept -> Client &
auto id() const -> UniqueClientId
Returns the [UniqueClientId] of the [Client].
auto max_active_requests() const -> uint64_t
Returns the maximal active requests a [Client] can send.
auto initial_max_slice_len() const -> uint64_t
Returns the maximum number of elements that can be loaned in a slice.
Non-owning view of a [PortName].
static auto from_native_ptr(iox2_port_name_ptr m_ptr) -> PortNameView
Creates a [PortNameView] from a native [iox2_port_name_ptr].
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 >
RequestSendError
Failure that can be emitted when a [RequestMut] is sent.
static void placement_default(S &payload)