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"
24#include "iox2/marker.hpp"
26#include "iox2/payload_info.hpp"
29#include "iox2/service_type.hpp"
30#include "iox2/type_name.hpp"
31#include "iox2/type_variant.hpp"
32
33#include <cstring>
34#include <type_traits>
35
36namespace iox2 {
37template <typename RequestPayload,
38 typename RequestUserHeader,
39 typename ResponsePayload,
40 typename ResponseUserHeader,
42class ServiceBuilderRequestResponse;
43
53template <typename RequestPayload,
54 typename RequestUserHeader,
55 typename ResponsePayload,
56 typename ResponseUserHeader,
59 ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>& builder,
60 const TypeDetail& value) -> std::enable_if_t<std::is_same<RequestUserHeader, CustomHeaderMarker>::value>;
61
71template <typename RequestPayload,
72 typename RequestUserHeader,
73 typename ResponsePayload,
74 typename ResponseUserHeader,
77 ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>& builder,
78 const TypeDetail& value) -> std::enable_if_t<std::is_same<ResponseUserHeader, CustomHeaderMarker>::value>;
79
89template <typename RequestPayload,
90 typename RequestUserHeader,
91 typename ResponsePayload,
92 typename ResponseUserHeader,
95 ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>& builder,
96 const TypeDetail& value) -> std::enable_if_t<std::is_same<RequestPayload, bb::Slice<CustomPayloadMarker>>::value>;
97
107template <typename RequestPayload,
108 typename RequestUserHeader,
109 typename ResponsePayload,
110 typename ResponseUserHeader,
111 ServiceType S>
113 ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>& builder,
114 const TypeDetail& value) -> std::enable_if_t<std::is_same<ResponsePayload, bb::Slice<CustomPayloadMarker>>::value>;
115
116template <typename RequestPayload,
117 typename RequestUserHeader,
118 typename ResponsePayload,
119 typename ResponseUserHeader,
120 ServiceType S>
122 public:
127#ifdef DOXYGEN_MACRO_FIX
128 auto request_payload_alignment(const uint64_t value) -> decltype(auto);
129#else
131#endif
132
137#ifdef DOXYGEN_MACRO_FIX
138 auto response_payload_alignment(const uint64_t value) -> decltype(auto);
139#else
141#endif
142
146#ifdef DOXYGEN_MACRO_FIX
147 auto enable_safe_overflow_for_requests(const bool value) -> decltype(auto);
148#else
150#endif
151
155#ifdef DOXYGEN_MACRO_FIX
156 auto enable_safe_overflow_for_responses(const bool value) -> decltype(auto);
157#else
159#endif
160
164#ifdef DOXYGEN_MACRO_FIX
165 auto max_active_requests_per_client(const uint64_t value) -> decltype(auto);
166#else
168#endif
169
173#ifdef DOXYGEN_MACRO_FIX
174 auto max_response_buffer_size(const uint64_t value) -> decltype(auto);
175#else
177#endif
178
182#ifdef DOXYGEN_MACRO_FIX
183 auto max_servers(const uint64_t value) -> decltype(auto);
184#else
186#endif
187
191#ifdef DOXYGEN_MACRO_FIX
192 auto max_clients(const uint64_t value) -> decltype(auto);
193#else
195#endif
196
200#ifdef DOXYGEN_MACRO_FIX
201 auto max_nodes(const uint64_t value) -> decltype(auto);
202#else
204#endif
205
209#ifdef DOXYGEN_MACRO_FIX
210 auto max_borrowed_responses_per_pending_response(const uint64_t value) -> decltype(auto);
211#else
213#endif
214
217#ifdef DOXYGEN_MACRO_FIX
218 auto max_loaned_requests(const uint64_t value) -> decltype(auto);
219#else
221#endif
222
224#ifdef DOXYGEN_MACRO_FIX
225 auto enable_fire_and_forget_requests(const bool value) -> decltype(auto);
226#else
228#endif
229
230 public:
232 template <typename NewRequestUserHeader>
233 auto request_user_header() && -> ServiceBuilderRequestResponse<RequestPayload,
234 NewRequestUserHeader,
235 ResponsePayload,
236 ResponseUserHeader,
237 S>&&;
238
240 template <typename NewResponseUserHeader>
241 auto response_user_header() && -> ServiceBuilderRequestResponse<RequestPayload,
242 RequestUserHeader,
243 ResponsePayload,
244 NewResponseUserHeader,
245 S>&&;
246
250 auto resume_build() & -> ServiceBuilderRequestResponse<RequestPayload,
251 RequestUserHeader,
252 ResponsePayload,
253 ResponseUserHeader,
254 S>&&;
255
258 auto open_or_create() && -> bb::Expected<
261
268 auto open_or_create_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
271
273 auto open() && -> bb::Expected<
276
279 auto open_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
282
284 auto create() && -> bb::Expected<
287
289 auto create_with_attributes(const AttributeSpecifier& attributes) && -> bb::Expected<
292
293 private:
294 template <ServiceType>
295 friend class ServiceBuilder;
296
297 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
299 const TypeDetail& value)
300 -> std::enable_if_t<std::is_same<ReqH, CustomHeaderMarker>::value>;
301 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
303 const TypeDetail& value)
304 -> std::enable_if_t<std::is_same<ResH, CustomHeaderMarker>::value>;
305 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
307 const TypeDetail& value)
308 -> std::enable_if_t<std::is_same<ReqP, bb::Slice<CustomPayloadMarker>>::value>;
309 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
311 const TypeDetail& value)
312 -> std::enable_if_t<std::is_same<ResP, bb::Slice<CustomPayloadMarker>>::value>;
313
314 explicit ServiceBuilderRequestResponse(iox2_service_builder_h handle);
315
316 void set_parameters();
317 void derive_request_header_type_details();
318 void override_request_header_type_details(const TypeDetail& value);
319 void derive_response_header_type_details();
320 void override_response_header_type_details(const TypeDetail& value);
321 void derive_request_payload_type_details();
322 void override_request_payload_type_details(const TypeDetail& value);
323 void derive_response_payload_type_details();
324 void override_response_payload_type_details(const TypeDetail& value);
325
326 iox2_service_builder_request_response_h m_handle = nullptr;
327 bb::Optional<TypeDetail> m_request_header_type_details_override;
328 bb::Optional<TypeDetail> m_response_header_type_details_override;
329 bb::Optional<TypeDetail> m_request_payload_type_details_override;
330 bb::Optional<TypeDetail> m_response_payload_type_details_override;
331};
332
333template <typename RequestPayload,
334 typename RequestUserHeader,
335 typename ResponsePayload,
336 typename ResponseUserHeader,
337 ServiceType S>
338template <typename NewRequestUserHeader>
341 NewRequestUserHeader,
342 ResponsePayload,
343 ResponseUserHeader,
344 S>&& {
345 return std::move(
346 // required here since we just change the template header type but the builder structure stays the same
347 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
348 *reinterpret_cast<ServiceBuilderRequestResponse<RequestPayload,
349 NewRequestUserHeader,
350 ResponsePayload,
351 ResponseUserHeader,
352 S>*>(this));
353}
354
355template <typename RequestPayload,
356 typename RequestUserHeader,
357 typename ResponsePayload,
358 typename ResponseUserHeader,
359 ServiceType S>
360template <typename NewResponseUserHeader>
363 RequestUserHeader,
364 ResponsePayload,
365 NewResponseUserHeader,
366 S>&& {
367 return std::move(
368 // required here since we just change the template header type but the builder structure stays the same
369 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
370 *reinterpret_cast<ServiceBuilderRequestResponse<RequestPayload,
371 RequestUserHeader,
372 ResponsePayload,
373 NewResponseUserHeader,
374 S>*>(this));
375}
376
377template <typename RequestPayload,
378 typename RequestUserHeader,
379 typename ResponsePayload,
380 typename ResponseUserHeader,
381 ServiceType S>
383 resume_build() & -> ServiceBuilderRequestResponse<RequestPayload,
384 RequestUserHeader,
385 ResponsePayload,
386 ResponseUserHeader,
387 S>&& {
388 return std::move(*this);
389}
390
391template <typename RequestPayload,
392 typename RequestUserHeader,
393 typename ResponsePayload,
394 typename ResponseUserHeader,
395 ServiceType S>
400 set_parameters();
401
402 iox2_port_factory_request_response_h port_factory_handle {};
403 auto result = iox2_service_builder_request_response_open_or_create(m_handle, nullptr, &port_factory_handle);
404
405 if (result == IOX2_OK) {
407 port_factory_handle);
408 }
409
410 return bb::err(bb::into<RequestResponseOpenOrCreateError>(result));
411}
412
413template <typename RequestPayload,
414 typename RequestUserHeader,
415 typename ResponsePayload,
416 typename ResponseUserHeader,
417 ServiceType S>
419 open_or_create_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
422 set_parameters();
423
424 iox2_port_factory_request_response_h port_factory_handle {};
425 auto result = iox2_service_builder_request_response_open_or_create_with_attributes(
426 m_handle, &required_attributes.m_handle, nullptr, &port_factory_handle);
427
428 if (result == IOX2_OK) {
430 port_factory_handle);
431 }
432
433 return bb::err(bb::into<RequestResponseOpenOrCreateError>(result));
434}
435
436template <typename RequestPayload,
437 typename RequestUserHeader,
438 typename ResponsePayload,
439 typename ResponseUserHeader,
440 ServiceType S>
442 open() && -> bb::Expected<
445 set_parameters();
446
447 iox2_port_factory_request_response_h port_factory_handle {};
448 auto result = iox2_service_builder_request_response_open(m_handle, nullptr, &port_factory_handle);
449
450 if (result == IOX2_OK) {
452 port_factory_handle);
453 }
454
455 return bb::err(bb::into<RequestResponseOpenError>(result));
456}
457
458template <typename RequestPayload,
459 typename RequestUserHeader,
460 typename ResponsePayload,
461 typename ResponseUserHeader,
462 ServiceType S>
464 open_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
467 set_parameters();
468
469 iox2_port_factory_request_response_h port_factory_handle {};
470 auto result = iox2_service_builder_request_response_open_with_attributes(
471 m_handle, &required_attributes.m_handle, nullptr, &port_factory_handle);
472
473 if (result == IOX2_OK) {
475 port_factory_handle);
476 }
477
478 return bb::err(bb::into<RequestResponseOpenError>(result));
479}
480
481template <typename RequestPayload,
482 typename RequestUserHeader,
483 typename ResponsePayload,
484 typename ResponseUserHeader,
485 ServiceType S>
487 create() && -> bb::Expected<
490 set_parameters();
491
492 iox2_port_factory_request_response_h port_factory_handle {};
493 auto result = iox2_service_builder_request_response_create(m_handle, nullptr, &port_factory_handle);
494
495 if (result == IOX2_OK) {
497 port_factory_handle);
498 }
499
500 return bb::err(bb::into<RequestResponseCreateError>(result));
501}
502
503template <typename RequestPayload,
504 typename RequestUserHeader,
505 typename ResponsePayload,
506 typename ResponseUserHeader,
507 ServiceType S>
512 set_parameters();
513
514 iox2_port_factory_request_response_h port_factory_handle {};
515 auto result = iox2_service_builder_request_response_create_with_attributes(
516 m_handle, &attributes.m_handle, nullptr, &port_factory_handle);
517
518 if (result == IOX2_OK) {
520 port_factory_handle);
521 }
522
523 return bb::err(bb::into<RequestResponseCreateError>(result));
524}
525
526template <typename RequestPayload,
527 typename RequestUserHeader,
528 typename ResponsePayload,
529 typename ResponseUserHeader,
530 ServiceType S>
532 ServiceBuilderRequestResponse(iox2_service_builder_h handle)
533 : m_handle { iox2_service_builder_request_response(handle) } {
534}
535
536template <typename RequestPayload,
537 typename RequestUserHeader,
538 typename ResponsePayload,
539 typename ResponseUserHeader,
540 ServiceType S>
541inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
542 // NOLINTNEXTLINE(readability-function-size) the size cannot easily be reduced due to the amount of builder parameter
543 set_parameters() {
544 if (m_request_payload_alignment.has_value()) {
545 iox2_service_builder_request_response_request_payload_alignment(&m_handle, m_request_payload_alignment.value());
546 }
547 if (m_response_payload_alignment.has_value()) {
548 iox2_service_builder_request_response_response_payload_alignment(&m_handle,
549 m_response_payload_alignment.value());
550 }
551 if (m_enable_safe_overflow_for_requests.has_value()) {
552 iox2_service_builder_request_response_enable_safe_overflow_for_requests(
553 &m_handle, m_enable_safe_overflow_for_requests.value());
554 }
555 if (m_enable_safe_overflow_for_responses.has_value()) {
556 iox2_service_builder_request_response_enable_safe_overflow_for_responses(
557 &m_handle, m_enable_safe_overflow_for_responses.value());
558 }
559 if (m_max_active_requests_per_client.has_value()) {
560 iox2_service_builder_request_response_max_active_requests_per_client(&m_handle,
561 m_max_active_requests_per_client.value());
562 }
563 if (m_max_response_buffer_size.has_value()) {
564 iox2_service_builder_request_response_max_response_buffer_size(&m_handle, m_max_response_buffer_size.value());
565 }
566 if (m_max_servers.has_value()) {
567 iox2_service_builder_request_response_max_servers(&m_handle, m_max_servers.value());
568 }
569 if (m_max_clients.has_value()) {
570 iox2_service_builder_request_response_max_clients(&m_handle, m_max_clients.value());
571 }
572 if (m_max_nodes.has_value()) {
573 iox2_service_builder_request_response_set_max_nodes(&m_handle, m_max_nodes.value());
574 }
575 if (m_max_borrowed_responses_per_pending_response.has_value()) {
576 iox2_service_builder_request_response_max_borrowed_responses_per_pending_response(
577 &m_handle, m_max_borrowed_responses_per_pending_response.value());
578 }
579 if (m_max_loaned_requests.has_value()) {
580 iox2_service_builder_request_response_max_loaned_requests(&m_handle, m_max_loaned_requests.value());
581 }
582 if (m_enable_fire_and_forget_requests.has_value()) {
583 iox2_service_builder_request_response_enable_fire_and_forget_requests(
584 &m_handle, m_enable_fire_and_forget_requests.value());
585 }
586
587 if (m_request_header_type_details_override.has_value()) {
588 override_request_header_type_details(m_request_header_type_details_override.value());
589 } else {
590 derive_request_header_type_details();
591 }
592
593 if (m_response_header_type_details_override.has_value()) {
594 override_response_header_type_details(m_response_header_type_details_override.value());
595 } else {
596 derive_response_header_type_details();
597 }
598
599 if (m_request_payload_type_details_override.has_value()) {
600 override_request_payload_type_details(m_request_payload_type_details_override.value());
601 } else {
602 derive_request_payload_type_details();
603 }
604
605 if (m_response_payload_type_details_override.has_value()) {
606 override_response_payload_type_details(m_response_payload_type_details_override.value());
607 } else {
608 derive_response_payload_type_details();
609 }
610}
611
612template <typename RequestPayload,
613 typename RequestUserHeader,
614 typename ResponsePayload,
615 typename ResponseUserHeader,
616 ServiceType S>
617inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
618 derive_request_header_type_details() {
619 // request header type details derived from the compile-time RequestUserHeader
620 const auto header_layout = bb::Layout::from<RequestUserHeader>();
621 const auto header_type_name = internal::get_type_name<RequestUserHeader>();
622
623 const auto result = iox2_service_builder_request_response_set_request_header_type_details(
624 &m_handle,
625 iox2_type_variant_e_FIXED_SIZE,
626 header_type_name.unchecked_access().c_str(),
627 header_type_name.size(),
628 header_layout.size(),
629 header_layout.alignment());
630
631 if (result != IOX2_OK) {
632 IOX2_PANIC("This should never happen! Implementation failure while setting the Request-Header-Type.");
633 }
634}
635
636template <typename RequestPayload,
637 typename RequestUserHeader,
638 typename ResponsePayload,
639 typename ResponseUserHeader,
640 ServiceType S>
641inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
642 override_request_header_type_details(const TypeDetail& value) {
643 // request header type details provided at runtime
644 const auto type_variant =
645 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
646
647 const auto result = iox2_service_builder_request_response_set_request_header_type_details(
648 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
649
650 if (result != IOX2_OK) {
651 IOX2_PANIC("This should never happen! Implementation failure while setting the Request-Header-Type.");
652 }
653}
654
655template <typename RequestPayload,
656 typename RequestUserHeader,
657 typename ResponsePayload,
658 typename ResponseUserHeader,
659 ServiceType S>
660inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
661 derive_response_header_type_details() {
662 // response header type details derived from the compile-time ResponseUserHeader
663 const auto header_layout = bb::Layout::from<ResponseUserHeader>();
664 const auto header_type_name = internal::get_type_name<ResponseUserHeader>();
665
666 const auto result = iox2_service_builder_request_response_set_response_header_type_details(
667 &m_handle,
668 iox2_type_variant_e_FIXED_SIZE,
669 header_type_name.unchecked_access().c_str(),
670 header_type_name.size(),
671 header_layout.size(),
672 header_layout.alignment());
673
674 if (result != IOX2_OK) {
675 IOX2_PANIC("This should never happen! Implementation failure while setting the Response-Header-Type.");
676 }
677}
678
679template <typename RequestPayload,
680 typename RequestUserHeader,
681 typename ResponsePayload,
682 typename ResponseUserHeader,
683 ServiceType S>
684inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
685 override_response_header_type_details(const TypeDetail& value) {
686 // response header type details provided at runtime
687 const auto type_variant =
688 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
689
690 const auto result = iox2_service_builder_request_response_set_response_header_type_details(
691 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
692
693 if (result != IOX2_OK) {
694 IOX2_PANIC("This should never happen! Implementation failure while setting the Response-Header-Type.");
695 }
696}
697
698template <typename RequestPayload,
699 typename RequestUserHeader,
700 typename ResponsePayload,
701 typename ResponseUserHeader,
702 ServiceType S>
703inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
704 derive_request_payload_type_details() {
705 using ValueType = typename PayloadInfo<RequestPayload>::ValueType;
706
707 // request payload type details derived from the compile-time RequestPayload
708 const auto payload_type_name = internal::get_type_name<RequestPayload>();
709 const auto type_variant =
710 bb::IsSlice<RequestPayload>::VALUE ? iox2_type_variant_e_DYNAMIC : iox2_type_variant_e_FIXED_SIZE;
711
712 const auto result = iox2_service_builder_request_response_set_request_payload_type_details(
713 &m_handle,
714 type_variant,
715 payload_type_name.unchecked_access().c_str(),
716 payload_type_name.size(),
717 sizeof(ValueType),
718 alignof(ValueType));
719
720 if (result != IOX2_OK) {
721 IOX2_PANIC("This should never happen! Implementation failure while setting the RequestPayload-Type.");
722 }
723}
724
725template <typename RequestPayload,
726 typename RequestUserHeader,
727 typename ResponsePayload,
728 typename ResponseUserHeader,
729 ServiceType S>
730inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
731 override_request_payload_type_details(const TypeDetail& value) {
732 // request payload type details provided at runtime
733 const auto type_variant =
734 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
735
736 const auto result = iox2_service_builder_request_response_set_request_payload_type_details(
737 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
738
739 if (result != IOX2_OK) {
740 IOX2_PANIC("This should never happen! Implementation failure while setting the RequestPayload-Type.");
741 }
742}
743
744template <typename RequestPayload,
745 typename RequestUserHeader,
746 typename ResponsePayload,
747 typename ResponseUserHeader,
748 ServiceType S>
749inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
750 derive_response_payload_type_details() {
751 using ValueType = typename PayloadInfo<ResponsePayload>::ValueType;
752
753 // response payload type details derived from the compile-time ResponsePayload
754 const auto payload_type_name = internal::get_type_name<ResponsePayload>();
755 const auto type_variant =
756 bb::IsSlice<ResponsePayload>::VALUE ? iox2_type_variant_e_DYNAMIC : iox2_type_variant_e_FIXED_SIZE;
757
758 const auto result = iox2_service_builder_request_response_set_response_payload_type_details(
759 &m_handle,
760 type_variant,
761 payload_type_name.unchecked_access().c_str(),
762 payload_type_name.size(),
763 sizeof(ValueType),
764 alignof(ValueType));
765
766 if (result != IOX2_OK) {
767 IOX2_PANIC("This should never happen! Implementation failure while setting the ResponsePayload-Type.");
768 }
769}
770
771template <typename RequestPayload,
772 typename RequestUserHeader,
773 typename ResponsePayload,
774 typename ResponseUserHeader,
775 ServiceType S>
776inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
777 override_response_payload_type_details(const TypeDetail& value) {
778 // response payload type details provided at runtime
779 const auto type_variant =
780 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
781
782 const auto result = iox2_service_builder_request_response_set_response_payload_type_details(
783 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
784
785 if (result != IOX2_OK) {
786 IOX2_PANIC("This should never happen! Implementation failure while setting the ResponsePayload-Type.");
787 }
788}
789
790template <typename RequestPayload,
791 typename RequestUserHeader,
792 typename ResponsePayload,
793 typename ResponseUserHeader,
794 ServiceType S>
797 const TypeDetail& value) -> std::enable_if_t<std::is_same<RequestUserHeader, CustomHeaderMarker>::value> {
798 builder.m_request_header_type_details_override = bb::Optional<TypeDetail>(value);
799}
800
801template <typename RequestPayload,
802 typename RequestUserHeader,
803 typename ResponsePayload,
804 typename ResponseUserHeader,
805 ServiceType S>
808 const TypeDetail& value) -> std::enable_if_t<std::is_same<ResponseUserHeader, CustomHeaderMarker>::value> {
809 builder.m_response_header_type_details_override = bb::Optional<TypeDetail>(value);
810}
811
812template <typename RequestPayload,
813 typename RequestUserHeader,
814 typename ResponsePayload,
815 typename ResponseUserHeader,
816 ServiceType S>
819 const TypeDetail& value) -> std::enable_if_t<std::is_same<RequestPayload, bb::Slice<CustomPayloadMarker>>::value> {
820 builder.m_request_payload_type_details_override = bb::Optional<TypeDetail>(value);
821}
822
823template <typename RequestPayload,
824 typename RequestUserHeader,
825 typename ResponsePayload,
826 typename ResponseUserHeader,
827 ServiceType S>
830 const TypeDetail& value) -> std::enable_if_t<std::is_same<ResponsePayload, bb::Slice<CustomPayloadMarker>>::value> {
831 builder.m_response_payload_type_details_override = bb::Optional<TypeDetail>(value);
832}
833} // namespace iox2
834#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