13#ifndef IOX2_CLIENT_HPP
14#define IOX2_CLIENT_HPP
27 typename RequestPayload,
28 typename RequestUserHeader,
29 typename ResponsePayload,
30 typename ResponseUserHeader>
53 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
59 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
60 auto
send_copy(const RequestPayload& payload) const -> bb::Expected<
67 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
68 auto
send_slice_copy(bb::ImmutableSlice<ValueType>& payload) const -> bb::Expected<
74 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
81 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
89 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
96 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
101 template <
ServiceType, typename, typename, typename, typename>
104 explicit
Client(iox2_client_h handle) noexcept;
108 iox2_client_h m_handle =
nullptr;
112 typename RequestPayload,
113 typename RequestUserHeader,
114 typename ResponsePayload,
115 typename ResponseUserHeader>
118 *
this = std::move(rhs);
122 typename RequestPayload,
123 typename RequestUserHeader,
124 typename ResponsePayload,
125 typename ResponseUserHeader>
130 m_handle = rhs.m_handle;
131 rhs.m_handle =
nullptr;
138 typename RequestPayload,
139 typename RequestUserHeader,
140 typename ResponsePayload,
141 typename ResponseUserHeader>
147 typename RequestPayload,
148 typename RequestUserHeader,
149 typename ResponsePayload,
150 typename ResponseUserHeader>
153 iox2_unique_client_id_h id_handle =
nullptr;
154 iox2_client_id(&m_handle,
nullptr, &id_handle);
159 typename RequestPayload,
160 typename RequestUserHeader,
161 typename ResponsePayload,
162 typename ResponseUserHeader>
166 return iox2::bb::into<BackpressureStrategy>(
static_cast<int>(iox2_client_backpressure_strategy(&m_handle)));
170 typename RequestPayload,
171 typename RequestUserHeader,
172 typename ResponsePayload,
173 typename ResponseUserHeader>
177 return iox2_client_max_active_requests(&m_handle);
181 typename RequestPayload,
182 typename RequestUserHeader,
183 typename ResponsePayload,
184 typename ResponseUserHeader>
185template <
typename T,
typename>
189 return iox2_client_initial_max_slice_len(&m_handle);
193 typename RequestPayload,
194 typename RequestUserHeader,
195 typename ResponsePayload,
196 typename ResponseUserHeader>
197template <
typename T,
typename>
201 constexpr uint64_t NUMBER_OF_ELEMENTS = 1;
203 auto result = iox2_client_loan_slice_uninit(
204 &m_handle, &request.m_request.m_request, &request.m_request.m_handle, NUMBER_OF_ELEMENTS);
206 if (result == IOX2_OK) {
209 return bb::err(bb::into<LoanError>(result));
213 typename RequestPayload,
214 typename RequestUserHeader,
215 typename ResponsePayload,
216 typename ResponseUserHeader>
217template <
typename T,
typename>
219 uint64_t number_of_elements)
222 auto result = iox2_client_loan_slice_uninit(
223 &m_handle, &request.m_request.m_request, &request.m_request.m_handle, number_of_elements);
225 if (result == IOX2_OK) {
228 return bb::err(bb::into<LoanError>(result));
232 typename RequestPayload,
233 typename RequestUserHeader,
234 typename ResponsePayload,
235 typename ResponseUserHeader>
236template <
typename T,
typename>
238 const RequestPayload& payload)
const
241 static_assert(std::is_trivially_copyable<RequestPayload>::value,
242 "The client supports only trivially copyable request payload types.");
244 iox2_pending_response_h pending_response_handle {};
245 auto result = iox2_client_send_copy(
246 &m_handle,
static_cast<const void*
>(&payload),
sizeof(RequestPayload), 1,
nullptr, &pending_response_handle);
248 if (result == IOX2_OK) {
250 pending_response_handle);
253 return bb::err(bb::into<RequestSendError>(result));
257 typename RequestPayload,
258 typename RequestUserHeader,
259 typename ResponsePayload,
260 typename ResponseUserHeader>
261template <
typename T,
typename>
266 static_assert(std::is_trivially_copyable<ValueType>::value,
267 "The client supports only trivially copyable request payload types.");
269 iox2_pending_response_h pending_response_handle {};
270 auto result = iox2_client_send_copy(&m_handle,
272 sizeof(
typename RequestPayload::ValueType),
273 payload.number_of_elements(),
275 &pending_response_handle);
277 if (result == IOX2_OK) {
279 pending_response_handle);
282 return bb::err(bb::into<RequestSendError>(result));
286 typename RequestPayload,
287 typename RequestUserHeader,
288 typename ResponsePayload,
289 typename ResponseUserHeader>
290template <
typename T,
typename>
294 if (!request.has_value()) {
295 return bb::err(request.error());
298 new (&request->payload_mut()) RequestPayload();
303 typename RequestPayload,
304 typename RequestUserHeader,
305 typename ResponsePayload,
306 typename ResponseUserHeader>
307template <
typename T,
typename>
309 uint64_t number_of_elements)
312 if (!request_uninit.has_value()) {
313 return bb::err(request_uninit.error());
316 auto request_init = std::move(request_uninit.value());
317 for (
auto& item : request_init.payload_mut()) {
318 new (&item) ValueType();
325 typename RequestPayload,
326 typename RequestUserHeader,
327 typename ResponsePayload,
328 typename ResponseUserHeader>
330 iox2_client_h handle) noexcept
331 : m_handle { handle } {
335 typename RequestPayload,
336 typename RequestUserHeader,
337 typename ResponsePayload,
338 typename ResponseUserHeader>
339inline void Client<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>::drop() {
340 if (m_handle !=
nullptr) {
341 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 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.
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)