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/server.hpp"
24#include "iox2/server_error.hpp"
25#include "iox2/service_type.hpp"
26
27namespace iox2 {
31template <ServiceType Service,
32 typename RequestPayload,
33 typename RequestUserHeader,
34 typename ResponsePayload,
35 typename ResponseUserHeader>
37 public:
41#ifdef DOXYGEN_MACRO_FIX
42 auto backpressure_strategy(const BackpressureStrategy value) -> decltype(auto);
43#else
45#endif
46
49#ifdef DOXYGEN_MACRO_FIX
50 auto max_loaned_responses_per_request(const uint64_t value) -> decltype(auto);
51#else
53#endif
54
55 public:
60 ~PortFactoryServer() = default;
61
75
77 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
78 auto initial_max_slice_len(uint64_t value) && -> PortFactoryServer&&;
79
84 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
86
94
102
112
114 auto
117
118 private:
119 template <ServiceType, typename, typename, typename, typename>
121
122 explicit PortFactoryServer(iox2_port_factory_server_builder_h handle);
123
124 iox2_port_factory_server_builder_h m_handle = nullptr;
125 bb::Optional<uint64_t> m_max_slice_len;
126 bb::Optional<AllocationStrategy> m_allocation_strategy;
127 bb::Optional<OverridePreallocationCallback> m_override_preallocation_callback;
128 bb::Optional<DegradationHandler* const> m_request_degradation_handler;
129 bb::Optional<DegradationHandler* const> m_response_degradation_handler;
130 bb::Optional<BackpressureHandler* const> m_backpressure_handler;
131};
132
133template <ServiceType Service,
134 typename RequestPayload,
135 typename RequestUserHeader,
136 typename ResponsePayload,
137 typename ResponseUserHeader>
138template <typename T, typename>
140 initial_max_slice_len(uint64_t value) && -> PortFactoryServer&& {
141 m_max_slice_len.emplace(value);
142 return std::move(*this);
143}
144
145template <ServiceType Service,
146 typename RequestPayload,
147 typename RequestUserHeader,
148 typename ResponsePayload,
149 typename ResponseUserHeader>
152 m_override_preallocation_callback.emplace(callback);
153 return std::move(*this);
154}
155
156template <ServiceType Service,
157 typename RequestPayload,
158 typename RequestUserHeader,
159 typename ResponsePayload,
160 typename ResponseUserHeader>
161template <typename T, typename>
162inline auto
168
169template <ServiceType Service,
170 typename RequestPayload,
171 typename RequestUserHeader,
172 typename ResponsePayload,
173 typename ResponseUserHeader>
176 m_request_degradation_handler.emplace(handler);
177 return std::move(*this);
178}
179
180template <ServiceType Service,
181 typename RequestPayload,
182 typename RequestUserHeader,
183 typename ResponsePayload,
184 typename ResponseUserHeader>
187 m_response_degradation_handler.emplace(handler);
188 return std::move(*this);
189}
190
191template <ServiceType Service,
192 typename RequestPayload,
193 typename RequestUserHeader,
194 typename ResponsePayload,
195 typename ResponseUserHeader>
198 m_backpressure_handler.emplace(handler);
199 return std::move(*this);
200}
201
202template <ServiceType Service,
203 typename RequestPayload,
204 typename RequestUserHeader,
205 typename ResponsePayload,
206 typename ResponseUserHeader>
210 if (m_backpressure_strategy.has_value()) {
211 iox2_port_factory_server_builder_backpressure_strategy(
212 &m_handle, static_cast<iox2_backpressure_strategy_e>(iox2::bb::into<int>(m_backpressure_strategy.value())));
213 }
214 if (m_max_slice_len.has_value()) {
215 iox2_port_factory_server_builder_set_initial_max_slice_len(&m_handle, m_max_slice_len.value());
216 } else {
217 iox2_port_factory_server_builder_set_initial_max_slice_len(&m_handle, 1);
218 }
219 if (m_max_loaned_responses_per_request.has_value()) {
220 iox2_port_factory_server_builder_set_max_loaned_responses_per_request(
221 &m_handle, m_max_loaned_responses_per_request.value());
222 }
223 if (m_allocation_strategy.has_value()) {
224 iox2_port_factory_server_builder_set_allocation_strategy(
225 &m_handle, bb::into<iox2_allocation_strategy_e>(m_allocation_strategy.value()));
226 }
227 if (m_override_preallocation_callback.has_value()) {
228 // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) must be a raw pointer - crosses FFI boundary
229 auto* callback = new OverridePreallocationCallback(m_override_preallocation_callback.value());
230 // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) must be a raw pointer - crosses FFI boundary
232 iox2_port_factory_server_builder_override_responses_preallocation(
233 &m_handle, internal::override_callback, static_cast<void*>(ctx));
234 }
235
236 if (m_request_degradation_handler.has_value()) {
237 iox2_port_factory_server_builder_set_request_degradation_handler(
238 &m_handle, detail::degradation_handler_delegate, static_cast<void*>(m_request_degradation_handler.value()));
239 }
240
241 if (m_response_degradation_handler.has_value()) {
242 iox2_port_factory_server_builder_set_response_degradation_handler(
243 &m_handle,
245 static_cast<void*>(m_response_degradation_handler.value()));
246 }
247
248 if (m_backpressure_handler.has_value()) {
249 iox2_port_factory_server_builder_set_backpressure_handler(
250 &m_handle, detail::backpressure_handler_delegate, static_cast<void*>(m_backpressure_handler.value()));
251 }
252
253 iox2_server_h server_handle {};
254 auto result = iox2_port_factory_server_builder_create(m_handle, nullptr, &server_handle);
255
256 if (result == IOX2_OK) {
258 }
259
260 return bb::err(bb::into<ServerCreateError>(result));
261}
262
263template <ServiceType Service,
264 typename RequestPayload,
265 typename RequestUserHeader,
266 typename ResponsePayload,
267 typename ResponseUserHeader>
269 PortFactoryServer(iox2_port_factory_server_builder_h handle)
270 : m_handle { handle } {
271}
272} // namespace iox2
273#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 set_request_degradation_handler(DegradationHandler *handler) &&-> PortFactoryServer &&
auto max_loaned_responses_per_request(const uint64_t value) -> decltype(auto)
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