13#ifndef IOX2_CLIENT_HPP
14#define IOX2_CLIENT_HPP
18#include "iox2/deployment/iceoryx2_cxx_feature_flags.hpp"
29 typename RequestPayload,
30 typename RequestUserHeader,
31 typename ResponsePayload,
32 typename ResponseUserHeader>
58 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
64 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
65 auto
send_copy(const RequestPayload& payload) const -> bb::Expected<
72 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
73 auto
send_slice_copy(bb::ImmutableSlice<ValueType>& payload) const -> bb::Expected<
79 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
86 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
94 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE,
void>>
101 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
105#if IOX2_FEATURE_FLATBUFFERS
107 template <typename T = RequestPayload, typename = std::enable_if_t<has_flatbuffer_marker<T>(),
void>>
114 template <ServiceType,
typename,
typename,
typename,
typename>
117 explicit Client(iox2_client_h handle)
noexcept;
121 iox2_client_h m_handle =
nullptr;
125 typename RequestPayload,
126 typename RequestUserHeader,
127 typename ResponsePayload,
128 typename ResponseUserHeader>
131 *
this = std::move(rhs);
135 typename RequestPayload,
136 typename RequestUserHeader,
137 typename ResponsePayload,
138 typename ResponseUserHeader>
143 m_handle = rhs.m_handle;
144 rhs.m_handle =
nullptr;
151 typename RequestPayload,
152 typename RequestUserHeader,
153 typename ResponsePayload,
154 typename ResponseUserHeader>
160 typename RequestPayload,
161 typename RequestUserHeader,
162 typename ResponsePayload,
163 typename ResponseUserHeader>
166 iox2_unique_client_id_h id_handle =
nullptr;
167 iox2_client_id(&m_handle,
nullptr, &id_handle);
172 typename RequestPayload,
174 typename ResponsePayload,
178 const auto* port_name_ptr = iox2_client_name(&m_handle);
183 typename RequestPayload,
184 typename RequestUserHeader,
185 typename ResponsePayload,
186 typename ResponseUserHeader>
190 return iox2::bb::into<BackpressureStrategy>(
static_cast<int>(iox2_client_backpressure_strategy(&m_handle)));
194 typename RequestPayload,
195 typename RequestUserHeader,
196 typename ResponsePayload,
197 typename ResponseUserHeader>
201 return iox2_client_max_active_requests(&m_handle);
205 typename RequestPayload,
206 typename RequestUserHeader,
207 typename ResponsePayload,
208 typename ResponseUserHeader>
209template <
typename T,
typename>
213 return iox2_client_initial_max_slice_len(&m_handle);
217 typename RequestPayload,
218 typename RequestUserHeader,
219 typename ResponsePayload,
220 typename ResponseUserHeader>
221template <
typename T,
typename>
225 constexpr uint64_t NUMBER_OF_ELEMENTS = 1;
227 auto result = iox2_client_loan_slice_uninit(
228 &m_handle, &request.m_request.m_request, &request.m_request.m_handle, NUMBER_OF_ELEMENTS);
230 if (result == IOX2_OK) {
233 return bb::err(bb::into<LoanError>(result));
237 typename RequestPayload,
238 typename RequestUserHeader,
239 typename ResponsePayload,
240 typename ResponseUserHeader>
241template <
typename T,
typename>
243 uint64_t number_of_elements)
246 auto result = iox2_client_loan_slice_uninit(
247 &m_handle, &request.m_request.m_request, &request.m_request.m_handle, number_of_elements);
249 if (result == IOX2_OK) {
252 return bb::err(bb::into<LoanError>(result));
256 typename RequestPayload,
257 typename RequestUserHeader,
258 typename ResponsePayload,
259 typename ResponseUserHeader>
260template <
typename T,
typename>
262 const RequestPayload& payload)
const
265 static_assert(std::is_trivially_copyable<RequestPayload>::value,
266 "The client supports only trivially copyable request payload types.");
268 iox2_pending_response_h pending_response_handle {};
269 auto result = iox2_client_send_copy(
270 &m_handle,
static_cast<const void*
>(&payload),
sizeof(RequestPayload), 1,
nullptr, &pending_response_handle);
272 if (result == IOX2_OK) {
274 pending_response_handle);
277 return bb::err(bb::into<RequestSendError>(result));
281 typename RequestPayload,
282 typename RequestUserHeader,
283 typename ResponsePayload,
284 typename ResponseUserHeader>
285template <
typename T,
typename>
290 static_assert(std::is_trivially_copyable<ValueType>::value,
291 "The client supports only trivially copyable request payload types.");
293 iox2_pending_response_h pending_response_handle {};
294 auto result = iox2_client_send_copy(&m_handle,
296 sizeof(
typename RequestPayload::ValueType),
297 payload.number_of_elements(),
299 &pending_response_handle);
301 if (result == IOX2_OK) {
303 pending_response_handle);
306 return bb::err(bb::into<RequestSendError>(result));
310 typename RequestPayload,
311 typename RequestUserHeader,
312 typename ResponsePayload,
313 typename ResponseUserHeader>
314template <
typename T,
typename>
318 if (!request.has_value()) {
319 return bb::err(request.error());
322 new (&request->payload_mut()) RequestPayload();
327 typename RequestPayload,
328 typename RequestUserHeader,
329 typename ResponsePayload,
330 typename ResponseUserHeader>
331template <
typename T,
typename>
333 uint64_t number_of_elements)
335 auto request_uninit = loan_slice_uninit(number_of_elements);
336 if (!request_uninit.has_value()) {
337 return bb::err(request_uninit.error());
340 auto request_init = std::move(request_uninit.value());
341 for (
auto& item : request_init.payload_mut()) {
342 new (&item) ValueType();
349 typename RequestPayload,
350 typename RequestUserHeader,
351 typename ResponsePayload,
352 typename ResponseUserHeader>
354 iox2_client_h handle) noexcept
355 : m_handle { handle } {
359 typename RequestPayload,
360 typename RequestUserHeader,
361 typename ResponsePayload,
362 typename ResponseUserHeader>
363inline void Client<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>::drop() {
364 if (m_handle !=
nullptr) {
365 iox2_client_drop(m_handle);
370#if IOX2_FEATURE_FLATBUFFERS
372 typename RequestPayload,
373 typename RequestUserHeader,
374 typename ResponsePayload,
375 typename ResponseUserHeader>
376template <
typename T,
typename>
383 iox2_client_loan_slice_uninit(&m_handle, &request.m_request.m_request, &request.m_request.m_handle, 1);
385 if (result != IOX2_OK) {
386 return bb::err(iox2::bb::into<LoanError>(result));
389 iox2_resizable_memory_request_h resizable_memory_handle {};
390 iox2_request_mut_create_resizable_memory(&request.m_request.m_handle,
nullptr, &resizable_memory_handle);
395 auto initial_size = request.m_memory->len();
396 request.m_flatbuffer_builder = flatbuffers::FlatBufferBuilder(initial_size, request.m_memory,
true);
398 return std::move(request);
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_flatbuffer() -> bb::Expected< RequestMutUninit< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, LoanError >
Acquires a [RequestMutUninit] with an integrated flatbuffer builder.
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.
Internal helper class to handle dynamic memory allocations used in e.g. flatbuffers.
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 >
auto loan_uninit(EntryHandleMut< S, KeyType, ValueType > &&self) -> EntryValueUninit< S, KeyType, ValueType >
RequestSendError
Failure that can be emitted when a [RequestMut] is sent.
static void placement_default(S &payload)