iceoryx2
C++ Language 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/port_name.hpp"
24#include "iox2/server.hpp"
25#include "iox2/server_error.hpp"
26#include "iox2/service_type.hpp"
27
28namespace iox2 {
32template <ServiceType Service,
33 typename RequestPayload,
34 typename RequestUserHeader,
35 typename ResponsePayload,
36 typename ResponseUserHeader>
38 public:
42#ifdef DOXYGEN_MACRO_FIX
43 auto backpressure_strategy(const BackpressureStrategy value) -> decltype(auto);
44#else
46#endif
47
50#ifdef DOXYGEN_MACRO_FIX
51 auto max_loaned_responses_per_request(const uint64_t value) -> decltype(auto);
52#else
54#endif
55
59#ifdef DOXYGEN_MACRO_FIX
60 auto name(const PortName value) -> decltype(auto);
61#else
63#endif
64
65 public:
70 ~PortFactoryServer() = default;
71
85
87 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
88 auto initial_max_slice_len(uint64_t value) && -> PortFactoryServer&&;
89
94 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
96
104
112
122
124 auto
127
128 private:
129 template <ServiceType, typename, typename, typename, typename>
131
132 explicit PortFactoryServer(iox2_port_factory_server_builder_h handle);
133
134 iox2_port_factory_server_builder_h m_handle = nullptr;
135 bb::Optional<uint64_t> m_max_slice_len;
136 bb::Optional<AllocationStrategy> m_allocation_strategy;
137 bb::Optional<OverridePreallocationCallback> m_override_preallocation_callback;
138 bb::Optional<DegradationHandler* const> m_request_degradation_handler;
139 bb::Optional<DegradationHandler* const> m_response_degradation_handler;
140 bb::Optional<BackpressureHandler* const> m_backpressure_handler;
141};
142
143template <ServiceType Service,
144 typename RequestPayload,
145 typename RequestUserHeader,
146 typename ResponsePayload,
147 typename ResponseUserHeader>
148template <typename T, typename>
150 initial_max_slice_len(uint64_t value) && -> PortFactoryServer&& {
151 m_max_slice_len.emplace(value);
152 return std::move(*this);
153}
154
155template <ServiceType Service,
156 typename RequestPayload,
157 typename RequestUserHeader,
158 typename ResponsePayload,
159 typename ResponseUserHeader>
162 m_override_preallocation_callback.emplace(callback);
163 return std::move(*this);
164}
165
166template <ServiceType Service,
167 typename RequestPayload,
168 typename RequestUserHeader,
169 typename ResponsePayload,
170 typename ResponseUserHeader>
171template <typename T, typename>
172inline auto
178
179template <ServiceType Service,
180 typename RequestPayload,
181 typename RequestUserHeader,
182 typename ResponsePayload,
183 typename ResponseUserHeader>
186 m_request_degradation_handler.emplace(handler);
187 return std::move(*this);
188}
189
190template <ServiceType Service,
191 typename RequestPayload,
192 typename RequestUserHeader,
193 typename ResponsePayload,
194 typename ResponseUserHeader>
197 m_response_degradation_handler.emplace(handler);
198 return std::move(*this);
199}
200
201template <ServiceType Service,
202 typename RequestPayload,
203 typename RequestUserHeader,
204 typename ResponsePayload,
205 typename ResponseUserHeader>
208 m_backpressure_handler.emplace(handler);
209 return std::move(*this);
210}
211
212template <ServiceType Service,
213 typename RequestPayload,
214 typename RequestUserHeader,
215 typename ResponsePayload,
216 typename ResponseUserHeader>
220 if (m_backpressure_strategy.has_value()) {
221 iox2_port_factory_server_builder_backpressure_strategy(
222 &m_handle, static_cast<iox2_backpressure_strategy_e>(iox2::bb::into<int>(m_backpressure_strategy.value())));
223 }
224 if (m_max_slice_len.has_value()) {
225 iox2_port_factory_server_builder_set_initial_max_slice_len(&m_handle, m_max_slice_len.value());
226 } else {
227 iox2_port_factory_server_builder_set_initial_max_slice_len(&m_handle, 1);
228 }
229 if (m_max_loaned_responses_per_request.has_value()) {
230 iox2_port_factory_server_builder_set_max_loaned_responses_per_request(
231 &m_handle, m_max_loaned_responses_per_request.value());
232 }
233 if (m_allocation_strategy.has_value()) {
234 iox2_port_factory_server_builder_set_allocation_strategy(
235 &m_handle, bb::into<iox2_allocation_strategy_e>(m_allocation_strategy.value()));
236 }
237 if (m_override_preallocation_callback.has_value()) {
238 // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) must be a raw pointer - crosses FFI boundary
239 auto* callback = new OverridePreallocationCallback(m_override_preallocation_callback.value());
240 // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) must be a raw pointer - crosses FFI boundary
242 iox2_port_factory_server_builder_override_responses_preallocation(
243 &m_handle, internal::override_callback, static_cast<void*>(ctx));
244 }
245
246 if (m_request_degradation_handler.has_value()) {
247 iox2_port_factory_server_builder_set_request_degradation_handler(
248 &m_handle, detail::degradation_handler_delegate, static_cast<void*>(m_request_degradation_handler.value()));
249 }
250
251 if (m_response_degradation_handler.has_value()) {
252 iox2_port_factory_server_builder_set_response_degradation_handler(
253 &m_handle,
255 static_cast<void*>(m_response_degradation_handler.value()));
256 }
257
258 if (m_backpressure_handler.has_value()) {
259 iox2_port_factory_server_builder_set_backpressure_handler(
260 &m_handle, detail::backpressure_handler_delegate, static_cast<void*>(m_backpressure_handler.value()));
261 }
262
263 if (m_name.has_value()) {
264 const auto* name_ptr = m_name.value().as_view().native_ptr();
265 iox2_port_factory_server_builder_set_name(&m_handle, name_ptr);
266 }
267
268 iox2_server_h server_handle {};
269 auto result = iox2_port_factory_server_builder_create(m_handle, nullptr, &server_handle);
270
271 if (result == IOX2_OK) {
273 }
274
275 return bb::err(bb::into<ServerCreateError>(result));
276}
277
278template <ServiceType Service,
279 typename RequestPayload,
280 typename RequestUserHeader,
281 typename ResponsePayload,
282 typename ResponseUserHeader>
284 PortFactoryServer(iox2_port_factory_server_builder_h handle)
285 : m_handle { handle } {
286}
287} // namespace iox2
288#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 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