iceoryx2
C++ Language Bindings
Loading...
Searching...
No Matches
service_builder_request_response.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_SERVICE_BUILDER_REQUEST_RESPONSE_HPP
14#define IOX2_SERVICE_BUILDER_REQUEST_RESPONSE_HPP
15
19#include "iox2/bb/expected.hpp"
20#include "iox2/bb/layout.hpp"
21#include "iox2/bb/slice.hpp"
27#include "iox2/payload_info.hpp"
30#include "iox2/service_type.hpp"
31#include "iox2/type_name.hpp"
32#include "iox2/type_variant.hpp"
33
34#include <cstring>
35#include <type_traits>
36
37namespace iox2 {
38template <typename RequestPayload,
39 typename RequestUserHeader,
40 typename ResponsePayload,
41 typename ResponseUserHeader,
43class ServiceBuilderRequestResponse;
44
54template <typename RequestPayload,
55 typename RequestUserHeader,
56 typename ResponsePayload,
57 typename ResponseUserHeader,
60 ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>& builder,
61 const TypeDetail& value) -> std::enable_if_t<std::is_same<RequestUserHeader, CustomHeaderMarker>::value>;
62
72template <typename RequestPayload,
73 typename RequestUserHeader,
74 typename ResponsePayload,
75 typename ResponseUserHeader,
78 ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>& builder,
79 const TypeDetail& value) -> std::enable_if_t<std::is_same<ResponseUserHeader, CustomHeaderMarker>::value>;
80
90template <typename RequestPayload,
91 typename RequestUserHeader,
92 typename ResponsePayload,
93 typename ResponseUserHeader,
96 ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>& builder,
97 const TypeDetail& value) -> std::enable_if_t<std::is_same<RequestPayload, bb::Slice<CustomPayloadMarker>>::value>;
98
108template <typename RequestPayload,
109 typename RequestUserHeader,
110 typename ResponsePayload,
111 typename ResponseUserHeader,
112 ServiceType S>
114 ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>& builder,
115 const TypeDetail& value) -> std::enable_if_t<std::is_same<ResponsePayload, bb::Slice<CustomPayloadMarker>>::value>;
116
117template <typename RequestPayload,
118 typename RequestUserHeader,
119 typename ResponsePayload,
120 typename ResponseUserHeader,
121 ServiceType S>
123 public:
128#ifdef DOXYGEN_MACRO_FIX
129 auto request_payload_alignment(const uint64_t value) -> decltype(auto);
130#else
132#endif
133
138#ifdef DOXYGEN_MACRO_FIX
139 auto response_payload_alignment(const uint64_t value) -> decltype(auto);
140#else
142#endif
143
147#ifdef DOXYGEN_MACRO_FIX
148 auto enable_safe_overflow_for_requests(const bool value) -> decltype(auto);
149#else
151#endif
152
156#ifdef DOXYGEN_MACRO_FIX
157 auto enable_safe_overflow_for_responses(const bool value) -> decltype(auto);
158#else
160#endif
161
165#ifdef DOXYGEN_MACRO_FIX
166 auto max_active_requests_per_client(const uint64_t value) -> decltype(auto);
167#else
169#endif
170
174#ifdef DOXYGEN_MACRO_FIX
175 auto max_response_buffer_size(const uint64_t value) -> decltype(auto);
176#else
178#endif
179
183#ifdef DOXYGEN_MACRO_FIX
184 auto max_servers(const uint64_t value) -> decltype(auto);
185#else
187#endif
188
192#ifdef DOXYGEN_MACRO_FIX
193 auto max_clients(const uint64_t value) -> decltype(auto);
194#else
196#endif
197
201#ifdef DOXYGEN_MACRO_FIX
202 auto max_nodes(const uint64_t value) -> decltype(auto);
203#else
205#endif
206
210#ifdef DOXYGEN_MACRO_FIX
211 auto max_borrowed_responses_per_pending_response(const uint64_t value) -> decltype(auto);
212#else
214#endif
215
218#ifdef DOXYGEN_MACRO_FIX
219 auto max_loaned_requests(const uint64_t value) -> decltype(auto);
220#else
222#endif
223
225#ifdef DOXYGEN_MACRO_FIX
226 auto enable_fire_and_forget_requests(const bool value) -> decltype(auto);
227#else
229#endif
230
231 public:
233 template <typename NewRequestUserHeader>
234 auto request_user_header() && -> ServiceBuilderRequestResponse<RequestPayload,
235 NewRequestUserHeader,
236 ResponsePayload,
237 ResponseUserHeader,
238 S>&&;
239
241 template <typename NewResponseUserHeader>
242 auto response_user_header() && -> ServiceBuilderRequestResponse<RequestPayload,
243 RequestUserHeader,
244 ResponsePayload,
245 NewResponseUserHeader,
246 S>&&;
247
251 auto resume_build() & -> ServiceBuilderRequestResponse<RequestPayload,
252 RequestUserHeader,
253 ResponsePayload,
254 ResponseUserHeader,
255 S>&&;
256
259 auto open_or_create() && -> bb::Expected<
262
269 auto open_or_create_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
272
274 auto open() && -> bb::Expected<
277
280 auto open_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
283
285 auto create() && -> bb::Expected<
288
290 auto create_with_attributes(const AttributeSpecifier& attributes) && -> bb::Expected<
293
294 private:
295 template <ServiceType>
296 friend class ServiceBuilder;
297
298 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
300 const TypeDetail& value)
301 -> std::enable_if_t<std::is_same<ReqH, CustomHeaderMarker>::value>;
302 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
304 const TypeDetail& value)
305 -> std::enable_if_t<std::is_same<ResH, CustomHeaderMarker>::value>;
306 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
308 const TypeDetail& value)
309 -> std::enable_if_t<std::is_same<ReqP, bb::Slice<CustomPayloadMarker>>::value>;
310 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
312 const TypeDetail& value)
313 -> std::enable_if_t<std::is_same<ResP, bb::Slice<CustomPayloadMarker>>::value>;
314
315 explicit ServiceBuilderRequestResponse(iox2_service_builder_h handle);
316
317 void set_parameters();
318 void derive_request_header_type_details();
319 void override_request_header_type_details(const TypeDetail& value);
320 void derive_response_header_type_details();
321 void override_response_header_type_details(const TypeDetail& value);
322 void derive_request_payload_type_details();
323 void override_request_payload_type_details(const TypeDetail& value);
324 void derive_response_payload_type_details();
325 void override_response_payload_type_details(const TypeDetail& value);
326
327 iox2_service_builder_request_response_h m_handle = nullptr;
328 bb::Optional<TypeDetail> m_request_header_type_details_override;
329 bb::Optional<TypeDetail> m_response_header_type_details_override;
330 bb::Optional<TypeDetail> m_request_payload_type_details_override;
331 bb::Optional<TypeDetail> m_response_payload_type_details_override;
332};
333
334template <typename RequestPayload,
335 typename RequestUserHeader,
336 typename ResponsePayload,
337 typename ResponseUserHeader,
338 ServiceType S>
339template <typename NewRequestUserHeader>
342 NewRequestUserHeader,
343 ResponsePayload,
344 ResponseUserHeader,
345 S>&& {
346 return std::move(
347 // required here since we just change the template header type but the builder structure stays the same
348 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
349 *reinterpret_cast<ServiceBuilderRequestResponse<RequestPayload,
350 NewRequestUserHeader,
351 ResponsePayload,
352 ResponseUserHeader,
353 S>*>(this));
354}
355
356template <typename RequestPayload,
357 typename RequestUserHeader,
358 typename ResponsePayload,
359 typename ResponseUserHeader,
360 ServiceType S>
361template <typename NewResponseUserHeader>
364 RequestUserHeader,
365 ResponsePayload,
366 NewResponseUserHeader,
367 S>&& {
368 return std::move(
369 // required here since we just change the template header type but the builder structure stays the same
370 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
371 *reinterpret_cast<ServiceBuilderRequestResponse<RequestPayload,
372 RequestUserHeader,
373 ResponsePayload,
374 NewResponseUserHeader,
375 S>*>(this));
376}
377
378template <typename RequestPayload,
379 typename RequestUserHeader,
380 typename ResponsePayload,
381 typename ResponseUserHeader,
382 ServiceType S>
384 resume_build() & -> ServiceBuilderRequestResponse<RequestPayload,
385 RequestUserHeader,
386 ResponsePayload,
387 ResponseUserHeader,
388 S>&& {
389 return std::move(*this);
390}
391
392template <typename RequestPayload,
393 typename RequestUserHeader,
394 typename ResponsePayload,
395 typename ResponseUserHeader,
396 ServiceType S>
401 set_parameters();
402
403 iox2_port_factory_request_response_h port_factory_handle {};
404 auto result = iox2_service_builder_request_response_open_or_create(m_handle, nullptr, &port_factory_handle);
405
406 if (result == IOX2_OK) {
408 port_factory_handle);
409 }
410
411 return bb::err(bb::into<RequestResponseOpenOrCreateError>(result));
412}
413
414template <typename RequestPayload,
415 typename RequestUserHeader,
416 typename ResponsePayload,
417 typename ResponseUserHeader,
418 ServiceType S>
420 open_or_create_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
423 set_parameters();
424
425 iox2_port_factory_request_response_h port_factory_handle {};
426 auto result = iox2_service_builder_request_response_open_or_create_with_attributes(
427 m_handle, &required_attributes.m_handle, nullptr, &port_factory_handle);
428
429 if (result == IOX2_OK) {
431 port_factory_handle);
432 }
433
434 return bb::err(bb::into<RequestResponseOpenOrCreateError>(result));
435}
436
437template <typename RequestPayload,
438 typename RequestUserHeader,
439 typename ResponsePayload,
440 typename ResponseUserHeader,
441 ServiceType S>
443 open() && -> bb::Expected<
446 set_parameters();
447
448 iox2_port_factory_request_response_h port_factory_handle {};
449 auto result = iox2_service_builder_request_response_open(m_handle, nullptr, &port_factory_handle);
450
451 if (result == IOX2_OK) {
453 port_factory_handle);
454 }
455
456 return bb::err(bb::into<RequestResponseOpenError>(result));
457}
458
459template <typename RequestPayload,
460 typename RequestUserHeader,
461 typename ResponsePayload,
462 typename ResponseUserHeader,
463 ServiceType S>
465 open_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
468 set_parameters();
469
470 iox2_port_factory_request_response_h port_factory_handle {};
471 auto result = iox2_service_builder_request_response_open_with_attributes(
472 m_handle, &required_attributes.m_handle, nullptr, &port_factory_handle);
473
474 if (result == IOX2_OK) {
476 port_factory_handle);
477 }
478
479 return bb::err(bb::into<RequestResponseOpenError>(result));
480}
481
482template <typename RequestPayload,
483 typename RequestUserHeader,
484 typename ResponsePayload,
485 typename ResponseUserHeader,
486 ServiceType S>
488 create() && -> bb::Expected<
491 set_parameters();
492
493 iox2_port_factory_request_response_h port_factory_handle {};
494 auto result = iox2_service_builder_request_response_create(m_handle, nullptr, &port_factory_handle);
495
496 if (result == IOX2_OK) {
498 port_factory_handle);
499 }
500
501 return bb::err(bb::into<RequestResponseCreateError>(result));
502}
503
504template <typename RequestPayload,
505 typename RequestUserHeader,
506 typename ResponsePayload,
507 typename ResponseUserHeader,
508 ServiceType S>
513 set_parameters();
514
515 iox2_port_factory_request_response_h port_factory_handle {};
516 auto result = iox2_service_builder_request_response_create_with_attributes(
517 m_handle, &attributes.m_handle, nullptr, &port_factory_handle);
518
519 if (result == IOX2_OK) {
521 port_factory_handle);
522 }
523
524 return bb::err(bb::into<RequestResponseCreateError>(result));
525}
526
527template <typename RequestPayload,
528 typename RequestUserHeader,
529 typename ResponsePayload,
530 typename ResponseUserHeader,
531 ServiceType S>
533 ServiceBuilderRequestResponse(iox2_service_builder_h handle)
534 : m_handle { iox2_service_builder_request_response(handle) } {
535}
536
537template <typename RequestPayload,
538 typename RequestUserHeader,
539 typename ResponsePayload,
540 typename ResponseUserHeader,
541 ServiceType S>
542inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
543 // NOLINTNEXTLINE(readability-function-size) the size cannot easily be reduced due to the amount of builder parameter
544 set_parameters() {
545 if (m_request_payload_alignment.has_value()) {
546 iox2_service_builder_request_response_request_payload_alignment(&m_handle, m_request_payload_alignment.value());
547 }
548 if (m_response_payload_alignment.has_value()) {
549 iox2_service_builder_request_response_response_payload_alignment(&m_handle,
550 m_response_payload_alignment.value());
551 }
552 if (m_enable_safe_overflow_for_requests.has_value()) {
553 iox2_service_builder_request_response_enable_safe_overflow_for_requests(
554 &m_handle, m_enable_safe_overflow_for_requests.value());
555 }
556 if (m_enable_safe_overflow_for_responses.has_value()) {
557 iox2_service_builder_request_response_enable_safe_overflow_for_responses(
558 &m_handle, m_enable_safe_overflow_for_responses.value());
559 }
560 if (m_max_active_requests_per_client.has_value()) {
561 iox2_service_builder_request_response_max_active_requests_per_client(&m_handle,
562 m_max_active_requests_per_client.value());
563 }
564 if (m_max_response_buffer_size.has_value()) {
565 iox2_service_builder_request_response_max_response_buffer_size(&m_handle, m_max_response_buffer_size.value());
566 }
567 if (m_max_servers.has_value()) {
568 iox2_service_builder_request_response_max_servers(&m_handle, m_max_servers.value());
569 }
570 if (m_max_clients.has_value()) {
571 iox2_service_builder_request_response_max_clients(&m_handle, m_max_clients.value());
572 }
573 if (m_max_nodes.has_value()) {
574 iox2_service_builder_request_response_set_max_nodes(&m_handle, m_max_nodes.value());
575 }
576 if (m_max_borrowed_responses_per_pending_response.has_value()) {
577 iox2_service_builder_request_response_max_borrowed_responses_per_pending_response(
578 &m_handle, m_max_borrowed_responses_per_pending_response.value());
579 }
580 if (m_max_loaned_requests.has_value()) {
581 iox2_service_builder_request_response_max_loaned_requests(&m_handle, m_max_loaned_requests.value());
582 }
583 if (m_enable_fire_and_forget_requests.has_value()) {
584 iox2_service_builder_request_response_enable_fire_and_forget_requests(
585 &m_handle, m_enable_fire_and_forget_requests.value());
586 }
587
588 if (m_request_header_type_details_override.has_value()) {
589 override_request_header_type_details(m_request_header_type_details_override.value());
590 } else {
591 derive_request_header_type_details();
592 }
593
594 if (m_response_header_type_details_override.has_value()) {
595 override_response_header_type_details(m_response_header_type_details_override.value());
596 } else {
597 derive_response_header_type_details();
598 }
599
600 if (m_request_payload_type_details_override.has_value()) {
601 override_request_payload_type_details(m_request_payload_type_details_override.value());
602 } else {
603 derive_request_payload_type_details();
604 }
605
606 if (m_response_payload_type_details_override.has_value()) {
607 override_response_payload_type_details(m_response_payload_type_details_override.value());
608 } else {
609 derive_response_payload_type_details();
610 }
611}
612
613template <typename RequestPayload,
614 typename RequestUserHeader,
615 typename ResponsePayload,
616 typename ResponseUserHeader,
617 ServiceType S>
618inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
619 derive_request_header_type_details() {
620 // request header type details derived from the compile-time RequestUserHeader
621 const auto header_layout = bb::Layout::from<RequestUserHeader>();
622 const auto header_type_name = internal::get_type_name<RequestUserHeader>();
623
624 const auto result = iox2_service_builder_request_response_set_request_header_type_details(
625 &m_handle,
626 iox2_type_variant_e_FIXED_SIZE,
627 header_type_name.unchecked_access().c_str(),
628 header_type_name.size(),
629 header_layout.size(),
630 header_layout.alignment());
631
632 if (result != IOX2_OK) {
633 IOX2_PANIC("This should never happen! Implementation failure while setting the Request-Header-Type.");
634 }
635}
636
637template <typename RequestPayload,
638 typename RequestUserHeader,
639 typename ResponsePayload,
640 typename ResponseUserHeader,
641 ServiceType S>
642inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
643 override_request_header_type_details(const TypeDetail& value) {
644 // request header type details provided at runtime
645 const auto type_variant =
646 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
647
648 const auto result = iox2_service_builder_request_response_set_request_header_type_details(
649 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
650
651 if (result != IOX2_OK) {
652 IOX2_PANIC("This should never happen! Implementation failure while setting the Request-Header-Type.");
653 }
654}
655
656template <typename RequestPayload,
657 typename RequestUserHeader,
658 typename ResponsePayload,
659 typename ResponseUserHeader,
660 ServiceType S>
661inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
662 derive_response_header_type_details() {
663 // response header type details derived from the compile-time ResponseUserHeader
664 const auto header_layout = bb::Layout::from<ResponseUserHeader>();
665 const auto header_type_name = internal::get_type_name<ResponseUserHeader>();
666
667 const auto result = iox2_service_builder_request_response_set_response_header_type_details(
668 &m_handle,
669 iox2_type_variant_e_FIXED_SIZE,
670 header_type_name.unchecked_access().c_str(),
671 header_type_name.size(),
672 header_layout.size(),
673 header_layout.alignment());
674
675 if (result != IOX2_OK) {
676 IOX2_PANIC("This should never happen! Implementation failure while setting the Response-Header-Type.");
677 }
678}
679
680template <typename RequestPayload,
681 typename RequestUserHeader,
682 typename ResponsePayload,
683 typename ResponseUserHeader,
684 ServiceType S>
685inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
686 override_response_header_type_details(const TypeDetail& value) {
687 // response header type details provided at runtime
688 const auto type_variant =
689 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
690
691 const auto result = iox2_service_builder_request_response_set_response_header_type_details(
692 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
693
694 if (result != IOX2_OK) {
695 IOX2_PANIC("This should never happen! Implementation failure while setting the Response-Header-Type.");
696 }
697}
698
699template <typename RequestPayload,
700 typename RequestUserHeader,
701 typename ResponsePayload,
702 typename ResponseUserHeader,
703 ServiceType S>
704inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
705 derive_request_payload_type_details() {
706 using ValueType = typename PayloadInfo<RequestPayload>::ValueType;
707
708 // request payload type details derived from the compile-time RequestPayload
709 const auto payload_type_name = internal::get_type_name<RequestPayload>();
710 const auto type_variant =
711 bb::IsSlice<RequestPayload>::VALUE ? iox2_type_variant_e_DYNAMIC : iox2_type_variant_e_FIXED_SIZE;
712
713 const auto result = iox2_service_builder_request_response_set_request_payload_type_details(
714 &m_handle,
715 type_variant,
716 payload_type_name.unchecked_access().c_str(),
717 payload_type_name.size(),
718 sizeof(ValueType),
719 alignof(ValueType));
720
721 if (result != IOX2_OK) {
722 IOX2_PANIC("This should never happen! Implementation failure while setting the RequestPayload-Type.");
723 }
724}
725
726template <typename RequestPayload,
727 typename RequestUserHeader,
728 typename ResponsePayload,
729 typename ResponseUserHeader,
730 ServiceType S>
731inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
732 override_request_payload_type_details(const TypeDetail& value) {
733 // request payload type details provided at runtime
734 const auto type_variant =
735 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
736
737 const auto result = iox2_service_builder_request_response_set_request_payload_type_details(
738 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
739
740 if (result != IOX2_OK) {
741 IOX2_PANIC("This should never happen! Implementation failure while setting the RequestPayload-Type.");
742 }
743}
744
745template <typename RequestPayload,
746 typename RequestUserHeader,
747 typename ResponsePayload,
748 typename ResponseUserHeader,
749 ServiceType S>
750inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
751 derive_response_payload_type_details() {
752 using ValueType = typename PayloadInfo<ResponsePayload>::ValueType;
753
754 // response payload type details derived from the compile-time ResponsePayload
755 const auto payload_type_name = internal::get_type_name<ResponsePayload>();
756 const auto type_variant =
757 bb::IsSlice<ResponsePayload>::VALUE ? iox2_type_variant_e_DYNAMIC : iox2_type_variant_e_FIXED_SIZE;
758
759 const auto result = iox2_service_builder_request_response_set_response_payload_type_details(
760 &m_handle,
761 type_variant,
762 payload_type_name.unchecked_access().c_str(),
763 payload_type_name.size(),
764 sizeof(ValueType),
765 alignof(ValueType));
766
767 if (result != IOX2_OK) {
768 IOX2_PANIC("This should never happen! Implementation failure while setting the ResponsePayload-Type.");
769 }
770}
771
772template <typename RequestPayload,
773 typename RequestUserHeader,
774 typename ResponsePayload,
775 typename ResponseUserHeader,
776 ServiceType S>
777inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
778 override_response_payload_type_details(const TypeDetail& value) {
779 // response payload type details provided at runtime
780 const auto type_variant =
781 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
782
783 const auto result = iox2_service_builder_request_response_set_response_payload_type_details(
784 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
785
786 if (result != IOX2_OK) {
787 IOX2_PANIC("This should never happen! Implementation failure while setting the ResponsePayload-Type.");
788 }
789}
790
791template <typename RequestPayload,
792 typename RequestUserHeader,
793 typename ResponsePayload,
794 typename ResponseUserHeader,
795 ServiceType S>
798 const TypeDetail& value) -> std::enable_if_t<std::is_same<RequestUserHeader, CustomHeaderMarker>::value> {
799 builder.m_request_header_type_details_override = bb::Optional<TypeDetail>(value);
800}
801
802template <typename RequestPayload,
803 typename RequestUserHeader,
804 typename ResponsePayload,
805 typename ResponseUserHeader,
806 ServiceType S>
809 const TypeDetail& value) -> std::enable_if_t<std::is_same<ResponseUserHeader, CustomHeaderMarker>::value> {
810 builder.m_response_header_type_details_override = bb::Optional<TypeDetail>(value);
811}
812
813template <typename RequestPayload,
814 typename RequestUserHeader,
815 typename ResponsePayload,
816 typename ResponseUserHeader,
817 ServiceType S>
820 const TypeDetail& value) -> std::enable_if_t<std::is_same<RequestPayload, bb::Slice<CustomPayloadMarker>>::value> {
821 builder.m_request_payload_type_details_override = bb::Optional<TypeDetail>(value);
822}
823
824template <typename RequestPayload,
825 typename RequestUserHeader,
826 typename ResponsePayload,
827 typename ResponseUserHeader,
828 ServiceType S>
831 const TypeDetail& value) -> std::enable_if_t<std::is_same<ResponsePayload, bb::Slice<CustomPayloadMarker>>::value> {
832 builder.m_response_payload_type_details_override = bb::Optional<TypeDetail>(value);
833}
834} // namespace iox2
835#endif
#define IOX2_PANIC(message)
calls panic handler and does not return
#define IOX2_BUILDER_OPTIONAL(type, name)
Definition builder.hpp:47
auto enable_safe_overflow_for_responses(const bool value) -> decltype(auto)
auto enable_fire_and_forget_requests(const bool value) -> decltype(auto)
If the [Service] is created, defines the fire-and-forget behavior of the service for requests.
auto max_clients(const uint64_t value) -> decltype(auto)
friend auto set_request_payload_type_details(ServiceBuilderRequestResponse< ReqP, ReqH, ResP, ResH, St > &builder, const TypeDetail &value) -> std::enable_if_t< std::is_same< ReqP, bb::Slice< CustomPayloadMarker > >::value >
auto response_user_header() &&-> ServiceBuilderRequestResponse< RequestPayload, RequestUserHeader, ResponsePayload, NewResponseUserHeader, S > &&
Sets the response user header type of the [Service].
auto request_user_header() &&-> ServiceBuilderRequestResponse< RequestPayload, NewRequestUserHeader, ResponsePayload, ResponseUserHeader, S > &&
Sets the request user header type of the [Service].
auto response_payload_alignment(const uint64_t value) -> decltype(auto)
auto open() &&-> bb::Expected< PortFactoryRequestResponse< S, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, RequestResponseOpenError >
Opens an existing [Service].
auto request_payload_alignment(const uint64_t value) -> decltype(auto)
friend auto set_response_payload_type_details(ServiceBuilderRequestResponse< ReqP, ReqH, ResP, ResH, St > &builder, const TypeDetail &value) -> std::enable_if_t< std::is_same< ResP, bb::Slice< CustomPayloadMarker > >::value >
auto create_with_attributes(const AttributeSpecifier &attributes) &&-> bb::Expected< PortFactoryRequestResponse< S, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, RequestResponseCreateError >
Creates a new [Service] with a set of attributes.
auto create() &&-> bb::Expected< PortFactoryRequestResponse< S, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, RequestResponseCreateError >
Creates a new [Service].
auto resume_build() &-> ServiceBuilderRequestResponse< RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S > &&
auto open_or_create() &&-> bb::Expected< PortFactoryRequestResponse< S, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, RequestResponseOpenOrCreateError >
auto open_or_create_with_attributes(const AttributeVerifier &required_attributes) &&-> bb::Expected< PortFactoryRequestResponse< S, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, RequestResponseOpenOrCreateError >
auto max_loaned_requests(const uint64_t value) -> decltype(auto)
auto enable_safe_overflow_for_requests(const bool value) -> decltype(auto)
auto max_active_requests_per_client(const uint64_t value) -> decltype(auto)
auto open_with_attributes(const AttributeVerifier &required_attributes) &&-> bb::Expected< PortFactoryRequestResponse< S, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, RequestResponseOpenError >
auto max_servers(const uint64_t value) -> decltype(auto)
auto max_response_buffer_size(const uint64_t value) -> decltype(auto)
auto max_nodes(const uint64_t value) -> decltype(auto)
friend auto set_response_header_type_details(ServiceBuilderRequestResponse< ReqP, ReqH, ResP, ResH, St > &builder, const TypeDetail &value) -> std::enable_if_t< std::is_same< ResH, CustomHeaderMarker >::value >
auto max_borrowed_responses_per_pending_response(const uint64_t value) -> decltype(auto)
friend auto set_request_header_type_details(ServiceBuilderRequestResponse< ReqP, ReqH, ResP, ResH, St > &builder, const TypeDetail &value) -> std::enable_if_t< std::is_same< ReqH, CustomHeaderMarker >::value >
Builder to create or open [Service]s.
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 set_response_payload_type_details(ServiceBuilderRequestResponse< RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S > &builder, const TypeDetail &value) -> std::enable_if_t< std::is_same< ResponsePayload, bb::Slice< CustomPayloadMarker > >::value >
auto set_request_payload_type_details(ServiceBuilderRequestResponse< RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S > &builder, const TypeDetail &value) -> std::enable_if_t< std::is_same< RequestPayload, bb::Slice< CustomPayloadMarker > >::value >
auto set_request_header_type_details(ServiceBuilderRequestResponse< RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S > &builder, const TypeDetail &value) -> std::enable_if_t< std::is_same< RequestUserHeader, CustomHeaderMarker >::value >
RequestResponseCreateError
Errors that can occur when a new [MessagingPattern::RequestResponse] [Service] shall be created.
@ FixedSize
A fixed size type like [u64].
auto set_response_header_type_details(ServiceBuilderRequestResponse< RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S > &builder, const TypeDetail &value) -> std::enable_if_t< std::is_same< ResponseUserHeader, CustomHeaderMarker >::value >
static constexpr bool VALUE
Definition slice.hpp:159