iceoryx2
C++ Bindings
Loading...
Searching...
No Matches
port_factory_server.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_PORTFACTORY_SERVER_HPP
14#define IOX2_PORTFACTORY_SERVER_HPP
15
19#include "iox2/bb/expected.hpp"
20#include "iox2/bb/optional.hpp"
23#include "iox2/marker.hpp"
24#include "iox2/port_name.hpp"
25#include "iox2/server.hpp"
26#include "iox2/server_error.hpp"
27#include "iox2/service_type.hpp"
28
29namespace iox2 {
33template <ServiceType Service,
34 typename RequestPayload,
35 typename RequestUserHeader,
36 typename ResponsePayload,
37 typename ResponseUserHeader>
39 public:
43#ifdef DOXYGEN_MACRO_FIX
44 auto backpressure_strategy(const BackpressureStrategy value) -> decltype(auto);
45#else
47#endif
48
51#ifdef DOXYGEN_MACRO_FIX
52 auto max_loaned_responses_per_request(const uint64_t value) -> decltype(auto);
53#else
55#endif
56
60#ifdef DOXYGEN_MACRO_FIX
61 auto name(const PortName value) -> decltype(auto);
62#else
64#endif
65
66 public:
71 ~PortFactoryServer() = default;
72
86
88 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
89 auto initial_max_slice_len(uint64_t value) && -> PortFactoryServer&&;
90
93 template <typename T = ResponsePayload, typename = std::enable_if_t<has_flatbuffer_marker<T>(), void>>
94 auto initial_reserved_memory(uint64_t value) && -> PortFactoryServer&&;
95
100 template <typename T = ResponsePayload,
101 typename = std::enable_if_t<bb::IsSlice<T>::VALUE || has_flatbuffer_marker<T>(), void>>
103
111
119
129
131 auto
134
135 private:
136 template <ServiceType, typename, typename, typename, typename>
138
139 explicit PortFactoryServer(iox2_port_factory_server_builder_h handle);
140
141 iox2_port_factory_server_builder_h m_handle = nullptr;
142 bb::Optional<uint64_t> m_max_slice_len;
143 bb::Optional<AllocationStrategy> m_allocation_strategy;
144 bb::Optional<OverridePreallocationCallback> m_override_preallocation_callback;
145 bb::Optional<DegradationHandler* const> m_request_degradation_handler;
146 bb::Optional<DegradationHandler* const> m_response_degradation_handler;
147 bb::Optional<BackpressureHandler* const> m_backpressure_handler;
148};
149
150template <ServiceType Service,
151 typename RequestPayload,
152 typename RequestUserHeader,
153 typename ResponsePayload,
154 typename ResponseUserHeader>
155template <typename T, typename>
157 initial_max_slice_len(uint64_t value) && -> PortFactoryServer&& {
158 m_max_slice_len.emplace(value);
159 return std::move(*this);
160}
161
162template <ServiceType Service,
163 typename RequestPayload,
164 typename RequestUserHeader,
165 typename ResponsePayload,
166 typename ResponseUserHeader>
167template <typename T, typename>
169 initial_reserved_memory(uint64_t value) && -> PortFactoryServer&& {
170 m_max_slice_len.emplace(value);
171 return std::move(*this);
172}
173
174template <ServiceType Service,
175 typename RequestPayload,
176 typename RequestUserHeader,
177 typename ResponsePayload,
178 typename ResponseUserHeader>
181 m_override_preallocation_callback.emplace(callback);
182 return std::move(*this);
183}
184
185template <ServiceType Service,
186 typename RequestPayload,
187 typename RequestUserHeader,
188 typename ResponsePayload,
189 typename ResponseUserHeader>
190template <typename T, typename>
191inline auto
197
198template <ServiceType Service,
199 typename RequestPayload,
200 typename RequestUserHeader,
201 typename ResponsePayload,
202 typename ResponseUserHeader>
205 m_request_degradation_handler.emplace(handler);
206 return std::move(*this);
207}
208
209template <ServiceType Service,
210 typename RequestPayload,
211 typename RequestUserHeader,
212 typename ResponsePayload,
213 typename ResponseUserHeader>
216 m_response_degradation_handler.emplace(handler);
217 return std::move(*this);
218}
219
220template <ServiceType Service,
221 typename RequestPayload,
222 typename RequestUserHeader,
223 typename ResponsePayload,
224 typename ResponseUserHeader>
227 m_backpressure_handler.emplace(handler);
228 return std::move(*this);
229}
230
231template <ServiceType Service,
232 typename RequestPayload,
233 typename RequestUserHeader,
234 typename ResponsePayload,
235 typename ResponseUserHeader>
239 if (m_backpressure_strategy.has_value()) {
240 iox2_port_factory_server_builder_backpressure_strategy(
241 &m_handle, static_cast<iox2_backpressure_strategy_e>(iox2::bb::into<int>(m_backpressure_strategy.value())));
242 }
243 if (m_max_slice_len.has_value()) {
244 iox2_port_factory_server_builder_set_initial_max_slice_len(&m_handle, m_max_slice_len.value());
245 } else {
246 iox2_port_factory_server_builder_set_initial_max_slice_len(&m_handle, 1);
247 }
248 if (m_max_loaned_responses_per_request.has_value()) {
249 iox2_port_factory_server_builder_set_max_loaned_responses_per_request(
250 &m_handle, m_max_loaned_responses_per_request.value());
251 }
252 if (m_allocation_strategy.has_value()) {
253 iox2_port_factory_server_builder_set_allocation_strategy(
254 &m_handle, bb::into<iox2_allocation_strategy_e>(m_allocation_strategy.value()));
255 }
256 if (m_override_preallocation_callback.has_value()) {
257 // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) must be a raw pointer - crosses FFI boundary
258 auto* callback = new OverridePreallocationCallback(m_override_preallocation_callback.value());
259 // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) must be a raw pointer - crosses FFI boundary
261 iox2_port_factory_server_builder_override_responses_preallocation(
262 &m_handle, internal::override_callback, static_cast<void*>(ctx));
263 }
264
265 if (m_request_degradation_handler.has_value()) {
266 iox2_port_factory_server_builder_set_request_degradation_handler(
267 &m_handle, detail::degradation_handler_delegate, static_cast<void*>(m_request_degradation_handler.value()));
268 }
269
270 if (m_response_degradation_handler.has_value()) {
271 iox2_port_factory_server_builder_set_response_degradation_handler(
272 &m_handle,
274 static_cast<void*>(m_response_degradation_handler.value()));
275 }
276
277 if (m_backpressure_handler.has_value()) {
278 iox2_port_factory_server_builder_set_backpressure_handler(
279 &m_handle, detail::backpressure_handler_delegate, static_cast<void*>(m_backpressure_handler.value()));
280 }
281
282 if (m_name.has_value()) {
283 const auto* name_ptr = m_name.value().as_view().native_ptr();
284 iox2_port_factory_server_builder_set_name(&m_handle, name_ptr);
285 }
286
287 iox2_server_h server_handle {};
288 auto result = iox2_port_factory_server_builder_create(m_handle, nullptr, &server_handle);
289
290 if (result == IOX2_OK) {
292 }
293
294 return bb::err(bb::into<ServerCreateError>(result));
295}
296
297template <ServiceType Service,
298 typename RequestPayload,
299 typename RequestUserHeader,
300 typename ResponsePayload,
301 typename ResponseUserHeader>
303 PortFactoryServer(iox2_port_factory_server_builder_h handle)
304 : m_handle { handle } {
305}
306} // namespace iox2
307#endif
#define IOX2_BUILDER_OPTIONAL(type, name)
Definition builder.hpp:47
PortFactoryServer(const PortFactoryServer &)=delete
auto initial_max_slice_len(uint64_t value) &&-> PortFactoryServer &&
Sets the maximum initial slice length configured for this [Server].
auto set_response_degradation_handler(DegradationHandler *handler) &&-> PortFactoryServer &&
auto allocation_strategy(AllocationStrategy value) &&-> PortFactoryServer &&
auto set_backpressure_handler(BackpressureHandler *handler) &&-> PortFactoryServer &&
PortFactoryServer(PortFactoryServer &&)=default
auto initial_reserved_memory(uint64_t value) &&-> PortFactoryServer &&
auto operator=(PortFactoryServer &&) -> PortFactoryServer &=default
auto operator=(const PortFactoryServer &) -> PortFactoryServer &=delete
auto override_response_preallocation(const OverridePreallocationCallback &callback) &&-> PortFactoryServer &&
auto backpressure_strategy(const BackpressureStrategy value) -> decltype(auto)
auto create() &&-> bb::Expected< Server< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, ServerCreateError >
Creates a new [Server] or returns a [ServerCreateError] on failure.
auto name(const PortName value) -> decltype(auto)
auto set_request_degradation_handler(DegradationHandler *handler) &&-> PortFactoryServer &&
auto max_loaned_responses_per_request(const uint64_t value) -> decltype(auto)
Represent the name for a [Port].
Definition port_name.hpp:52
constexpr auto err(const E &error) -> Unexpected< E >
Definition expected.hpp:33
iox2::bb::variation::Optional< T > Optional
Definition optional.hpp:25
iox2::bb::variation::Expected< T, E > Expected
Definition expected.hpp:22
auto backpressure_handler_delegate(iox2_backpressure_info_h_ref info_handle, iox2_callback_context callback_cxt) -> iox2_backpressure_action_e
auto degradation_handler_delegate(iox2_degradation_cause_e degradation_cause, iox2_degradation_info_h_ref info_handle, iox2_callback_context callback_cxt) -> iox2_degradation_action_e
auto override_callback(size_t value, iox2_callback_context ctx) -> size_t
ServerCreateError
iox2::bb::StaticFunction< size_t(size_t)> OverridePreallocationCallback