iceoryx2
C++ 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 template <typename U = RequestPayload, typename = std::enable_if_t<has_flatbuffer_marker<U>(), void>>
252 const bb::FilePath&
254
258 template <typename U = ResponsePayload, typename = std::enable_if_t<has_flatbuffer_marker<U>(), void>>
260 const bb::FilePath&
262
266 auto resume_build() & -> ServiceBuilderRequestResponse<RequestPayload,
267 RequestUserHeader,
268 ResponsePayload,
269 ResponseUserHeader,
270 S>&&;
271
274 auto open_or_create() && -> bb::Expected<
277
284 auto open_or_create_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
287
289 auto open() && -> bb::Expected<
292
295 auto open_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
298
300 auto create() && -> bb::Expected<
303
305 auto create_with_attributes(const AttributeSpecifier& attributes) && -> bb::Expected<
308
309 private:
310 template <ServiceType>
311 friend class ServiceBuilder;
312
313 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
315 const TypeDetail& value)
316 -> std::enable_if_t<std::is_same<ReqH, CustomHeaderMarker>::value>;
317 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
319 const TypeDetail& value)
320 -> std::enable_if_t<std::is_same<ResH, CustomHeaderMarker>::value>;
321 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
323 const TypeDetail& value)
324 -> std::enable_if_t<std::is_same<ReqP, bb::Slice<CustomPayloadMarker>>::value>;
325 template <typename ReqP, typename ReqH, typename ResP, typename ResH, ServiceType St>
327 const TypeDetail& value)
328 -> std::enable_if_t<std::is_same<ResP, bb::Slice<CustomPayloadMarker>>::value>;
329
330 template <typename U = RequestPayload>
331 auto set_request_type_definition_name_hint() -> std::enable_if_t<has_flatbuffer_marker<U>(), void>;
332 template <typename U = RequestPayload>
333 auto set_request_type_definition_name_hint() -> std::enable_if_t<!has_flatbuffer_marker<U>(), void>;
334
335 template <typename U = ResponsePayload>
336 auto set_response_type_definition_name_hint() -> std::enable_if_t<has_flatbuffer_marker<U>(), void>;
337 template <typename U = ResponsePayload>
338 auto set_response_type_definition_name_hint() -> std::enable_if_t<!has_flatbuffer_marker<U>(), void>;
339
340 explicit ServiceBuilderRequestResponse(iox2_service_builder_h handle);
341
342 void set_parameters();
343 void derive_request_header_type_details();
344 void override_request_header_type_details(const TypeDetail& value);
345 void derive_response_header_type_details();
346 void override_response_header_type_details(const TypeDetail& value);
347 void derive_request_payload_type_details();
348 void override_request_payload_type_details(const TypeDetail& value);
349 void derive_response_payload_type_details();
350 void override_response_payload_type_details(const TypeDetail& value);
351
352 iox2_service_builder_request_response_h m_handle = nullptr;
353 bb::Optional<TypeDetail> m_request_header_type_details_override;
354 bb::Optional<TypeDetail> m_response_header_type_details_override;
355 bb::Optional<TypeDetail> m_request_payload_type_details_override;
356 bb::Optional<TypeDetail> m_response_payload_type_details_override;
357};
358
359template <typename RequestPayload,
360 typename RequestUserHeader,
361 typename ResponsePayload,
362 typename ResponseUserHeader,
363 ServiceType S>
364template <typename NewRequestUserHeader>
367 NewRequestUserHeader,
368 ResponsePayload,
369 ResponseUserHeader,
370 S>&& {
371 return std::move(
372 // required here since we just change the template header type but the builder structure stays the same
373 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
374 *reinterpret_cast<ServiceBuilderRequestResponse<RequestPayload,
375 NewRequestUserHeader,
376 ResponsePayload,
377 ResponseUserHeader,
378 S>*>(this));
379}
380
381template <typename RequestPayload,
382 typename RequestUserHeader,
383 typename ResponsePayload,
384 typename ResponseUserHeader,
385 ServiceType S>
386template <typename NewResponseUserHeader>
389 RequestUserHeader,
390 ResponsePayload,
391 NewResponseUserHeader,
392 S>&& {
393 return std::move(
394 // required here since we just change the template header type but the builder structure stays the same
395 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
396 *reinterpret_cast<ServiceBuilderRequestResponse<RequestPayload,
397 RequestUserHeader,
398 ResponsePayload,
399 NewResponseUserHeader,
400 S>*>(this));
401}
402
403template <typename RequestPayload,
404 typename RequestUserHeader,
405 typename ResponsePayload,
406 typename ResponseUserHeader,
407 ServiceType S>
409 resume_build() & -> ServiceBuilderRequestResponse<RequestPayload,
410 RequestUserHeader,
411 ResponsePayload,
412 ResponseUserHeader,
413 S>&& {
414 return std::move(*this);
415}
416
417template <typename RequestPayload,
418 typename RequestUserHeader,
419 typename ResponsePayload,
420 typename ResponseUserHeader,
421 ServiceType S>
426 set_parameters();
427
428 iox2_port_factory_request_response_h port_factory_handle {};
429 auto result = iox2_service_builder_request_response_open_or_create(m_handle, nullptr, &port_factory_handle);
430
431 if (result == IOX2_OK) {
433 port_factory_handle);
434 }
435
436 return bb::err(bb::into<RequestResponseOpenOrCreateError>(result));
437}
438
439template <typename RequestPayload,
440 typename RequestUserHeader,
441 typename ResponsePayload,
442 typename ResponseUserHeader,
443 ServiceType S>
445 open_or_create_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
448 set_parameters();
449
450 iox2_port_factory_request_response_h port_factory_handle {};
451 auto result = iox2_service_builder_request_response_open_or_create_with_attributes(
452 m_handle, &required_attributes.m_handle, nullptr, &port_factory_handle);
453
454 if (result == IOX2_OK) {
456 port_factory_handle);
457 }
458
459 return bb::err(bb::into<RequestResponseOpenOrCreateError>(result));
460}
461
462template <typename RequestPayload,
463 typename RequestUserHeader,
464 typename ResponsePayload,
465 typename ResponseUserHeader,
466 ServiceType S>
468 open() && -> bb::Expected<
471 set_parameters();
472
473 iox2_port_factory_request_response_h port_factory_handle {};
474 auto result = iox2_service_builder_request_response_open(m_handle, nullptr, &port_factory_handle);
475
476 if (result == IOX2_OK) {
478 port_factory_handle);
479 }
480
481 return bb::err(bb::into<RequestResponseOpenError>(result));
482}
483
484template <typename RequestPayload,
485 typename RequestUserHeader,
486 typename ResponsePayload,
487 typename ResponseUserHeader,
488 ServiceType S>
490 open_with_attributes(const AttributeVerifier& required_attributes) && -> bb::Expected<
493 set_parameters();
494
495 iox2_port_factory_request_response_h port_factory_handle {};
496 auto result = iox2_service_builder_request_response_open_with_attributes(
497 m_handle, &required_attributes.m_handle, nullptr, &port_factory_handle);
498
499 if (result == IOX2_OK) {
501 port_factory_handle);
502 }
503
504 return bb::err(bb::into<RequestResponseOpenError>(result));
505}
506
507template <typename RequestPayload,
508 typename RequestUserHeader,
509 typename ResponsePayload,
510 typename ResponseUserHeader,
511 ServiceType S>
513 create() && -> bb::Expected<
516 set_parameters();
517
518 iox2_port_factory_request_response_h port_factory_handle {};
519 auto result = iox2_service_builder_request_response_create(m_handle, nullptr, &port_factory_handle);
520
521 if (result == IOX2_OK) {
523 port_factory_handle);
524 }
525
526 return bb::err(bb::into<RequestResponseCreateError>(result));
527}
528
529template <typename RequestPayload,
530 typename RequestUserHeader,
531 typename ResponsePayload,
532 typename ResponseUserHeader,
533 ServiceType S>
538 set_parameters();
539
540 iox2_port_factory_request_response_h port_factory_handle {};
541 auto result = iox2_service_builder_request_response_create_with_attributes(
542 m_handle, &attributes.m_handle, nullptr, &port_factory_handle);
543
544 if (result == IOX2_OK) {
546 port_factory_handle);
547 }
548
549 return bb::err(bb::into<RequestResponseCreateError>(result));
550}
551
552template <typename RequestPayload,
553 typename RequestUserHeader,
554 typename ResponsePayload,
555 typename ResponseUserHeader,
556 ServiceType S>
558 ServiceBuilderRequestResponse(iox2_service_builder_h handle)
559 : m_handle { iox2_service_builder_request_response(handle) } {
560}
561
562template <typename RequestPayload,
563 typename RequestUserHeader,
564 typename ResponsePayload,
565 typename ResponseUserHeader,
566 ServiceType S>
567template <typename U, typename>
570 const bb::FilePath&
572 iox2_service_builder_request_response_set_request_flatbuffer_schema_path(
573 &m_handle, value.as_string().unchecked_access().c_str());
574 return std::move(*this);
575}
576
577template <typename RequestPayload,
578 typename RequestUserHeader,
579 typename ResponsePayload,
580 typename ResponseUserHeader,
581 ServiceType S>
582template <typename U, typename>
585 const bb::FilePath&
587 iox2_service_builder_request_response_set_response_flatbuffer_schema_path(
588 &m_handle, value.as_string().unchecked_access().c_str());
589 return std::move(*this);
590}
591
592template <typename RequestPayload,
593 typename RequestUserHeader,
594 typename ResponsePayload,
595 typename ResponseUserHeader,
596 ServiceType S>
597template <typename U>
599 set_request_type_definition_name_hint() -> std::enable_if_t<has_flatbuffer_marker<U>(), void> {
600 auto type_name = iox2::internal::get_type_name<typename RequestPayload::ValueType>();
601 iox2_service_builder_request_response_request_type_definition_name_hint(
602 &m_handle, type_name.unchecked_access().c_str(), type_name.size(), "", 0);
603}
604
605template <typename RequestPayload,
606 typename RequestUserHeader,
607 typename ResponsePayload,
608 typename ResponseUserHeader,
609 ServiceType S>
610template <typename U>
611inline auto ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
612 set_response_type_definition_name_hint() -> std::enable_if_t<has_flatbuffer_marker<U>(), void> {
613 auto type_name = iox2::internal::get_type_name<typename ResponsePayload::ValueType>();
614 iox2_service_builder_request_response_response_type_definition_name_hint(
615 &m_handle, type_name.unchecked_access().c_str(), type_name.size(), "", 0);
616}
617
618template <typename RequestPayload,
619 typename RequestUserHeader,
620 typename ResponsePayload,
621 typename ResponseUserHeader,
622 ServiceType S>
623template <typename U>
624inline auto ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
625 set_request_type_definition_name_hint() -> std::enable_if_t<!has_flatbuffer_marker<U>(), void> {
626}
627
628template <typename RequestPayload,
629 typename RequestUserHeader,
630 typename ResponsePayload,
631 typename ResponseUserHeader,
632 ServiceType S>
633template <typename U>
634inline auto ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
635 set_response_type_definition_name_hint() -> std::enable_if_t<!has_flatbuffer_marker<U>(), void> {
636}
637
638template <typename RequestPayload,
639 typename RequestUserHeader,
640 typename ResponsePayload,
641 typename ResponseUserHeader,
642 ServiceType S>
643inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
644 // NOLINTNEXTLINE(readability-function-size) the size cannot easily be reduced due to the amount of builder parameter
645 set_parameters() {
646 if (m_request_payload_alignment.has_value()) {
647 iox2_service_builder_request_response_request_payload_alignment(&m_handle, m_request_payload_alignment.value());
648 }
649 if (m_response_payload_alignment.has_value()) {
650 iox2_service_builder_request_response_response_payload_alignment(&m_handle,
651 m_response_payload_alignment.value());
652 }
653 if (m_enable_safe_overflow_for_requests.has_value()) {
654 iox2_service_builder_request_response_enable_safe_overflow_for_requests(
655 &m_handle, m_enable_safe_overflow_for_requests.value());
656 }
657 if (m_enable_safe_overflow_for_responses.has_value()) {
658 iox2_service_builder_request_response_enable_safe_overflow_for_responses(
659 &m_handle, m_enable_safe_overflow_for_responses.value());
660 }
661 if (m_max_active_requests_per_client.has_value()) {
662 iox2_service_builder_request_response_max_active_requests_per_client(&m_handle,
663 m_max_active_requests_per_client.value());
664 }
665 if (m_max_response_buffer_size.has_value()) {
666 iox2_service_builder_request_response_max_response_buffer_size(&m_handle, m_max_response_buffer_size.value());
667 }
668 if (m_max_servers.has_value()) {
669 iox2_service_builder_request_response_max_servers(&m_handle, m_max_servers.value());
670 }
671 if (m_max_clients.has_value()) {
672 iox2_service_builder_request_response_max_clients(&m_handle, m_max_clients.value());
673 }
674 if (m_max_nodes.has_value()) {
675 iox2_service_builder_request_response_set_max_nodes(&m_handle, m_max_nodes.value());
676 }
677 if (m_max_borrowed_responses_per_pending_response.has_value()) {
678 iox2_service_builder_request_response_max_borrowed_responses_per_pending_response(
679 &m_handle, m_max_borrowed_responses_per_pending_response.value());
680 }
681 if (m_max_loaned_requests.has_value()) {
682 iox2_service_builder_request_response_max_loaned_requests(&m_handle, m_max_loaned_requests.value());
683 }
684 if (m_enable_fire_and_forget_requests.has_value()) {
685 iox2_service_builder_request_response_enable_fire_and_forget_requests(
686 &m_handle, m_enable_fire_and_forget_requests.value());
687 }
688
689 if (m_request_header_type_details_override.has_value()) {
690 override_request_header_type_details(m_request_header_type_details_override.value());
691 } else {
692 derive_request_header_type_details();
693 }
694
695 if (m_response_header_type_details_override.has_value()) {
696 override_response_header_type_details(m_response_header_type_details_override.value());
697 } else {
698 derive_response_header_type_details();
699 }
700
701 if (m_request_payload_type_details_override.has_value()) {
702 override_request_payload_type_details(m_request_payload_type_details_override.value());
703 } else {
704 derive_request_payload_type_details();
705 }
706
707 if (m_response_payload_type_details_override.has_value()) {
708 override_response_payload_type_details(m_response_payload_type_details_override.value());
709 } else {
710 derive_response_payload_type_details();
711 }
712
713 set_request_type_definition_name_hint();
714 set_response_type_definition_name_hint();
715}
716
717template <typename RequestPayload,
718 typename RequestUserHeader,
719 typename ResponsePayload,
720 typename ResponseUserHeader,
721 ServiceType S>
722inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
723 derive_request_header_type_details() {
724 // request header type details derived from the compile-time RequestUserHeader
725 const auto header_layout = bb::Layout::from<RequestUserHeader>();
726 const auto header_type_name = internal::get_type_name<RequestUserHeader>();
727
728 const auto result = iox2_service_builder_request_response_set_request_header_type_details(
729 &m_handle,
730 iox2_type_variant_e_FIXED_SIZE,
731 header_type_name.unchecked_access().c_str(),
732 header_type_name.size(),
733 header_layout.size(),
734 header_layout.alignment());
735
736 if (result != IOX2_OK) {
737 IOX2_PANIC("This should never happen! Implementation failure while setting the Request-Header-Type.");
738 }
739}
740
741template <typename RequestPayload,
742 typename RequestUserHeader,
743 typename ResponsePayload,
744 typename ResponseUserHeader,
745 ServiceType S>
746inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
747 override_request_header_type_details(const TypeDetail& value) {
748 // request header type details provided at runtime
749 const auto type_variant =
750 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
751
752 const auto result = iox2_service_builder_request_response_set_request_header_type_details(
753 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
754
755 if (result != IOX2_OK) {
756 IOX2_PANIC("This should never happen! Implementation failure while setting the Request-Header-Type.");
757 }
758}
759
760template <typename RequestPayload,
761 typename RequestUserHeader,
762 typename ResponsePayload,
763 typename ResponseUserHeader,
764 ServiceType S>
765inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
766 derive_response_header_type_details() {
767 // response header type details derived from the compile-time ResponseUserHeader
768 const auto header_layout = bb::Layout::from<ResponseUserHeader>();
769 const auto header_type_name = internal::get_type_name<ResponseUserHeader>();
770
771 const auto result = iox2_service_builder_request_response_set_response_header_type_details(
772 &m_handle,
773 iox2_type_variant_e_FIXED_SIZE,
774 header_type_name.unchecked_access().c_str(),
775 header_type_name.size(),
776 header_layout.size(),
777 header_layout.alignment());
778
779 if (result != IOX2_OK) {
780 IOX2_PANIC("This should never happen! Implementation failure while setting the Response-Header-Type.");
781 }
782}
783
784template <typename RequestPayload,
785 typename RequestUserHeader,
786 typename ResponsePayload,
787 typename ResponseUserHeader,
788 ServiceType S>
789inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
790 override_response_header_type_details(const TypeDetail& value) {
791 // response header type details provided at runtime
792 const auto type_variant =
793 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
794
795 const auto result = iox2_service_builder_request_response_set_response_header_type_details(
796 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
797
798 if (result != IOX2_OK) {
799 IOX2_PANIC("This should never happen! Implementation failure while setting the Response-Header-Type.");
800 }
801}
802
803template <typename RequestPayload,
804 typename RequestUserHeader,
805 typename ResponsePayload,
806 typename ResponseUserHeader,
807 ServiceType S>
808inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
809 derive_request_payload_type_details() {
810 using ValueType = typename PayloadInfo<RequestPayload>::ValueType;
811
812 // request payload type details derived from the compile-time RequestPayload
813 const auto payload_type_name = internal::get_type_name<RequestPayload>();
814 const auto type_variant =
815 bb::IsSlice<RequestPayload>::VALUE ? iox2_type_variant_e_DYNAMIC : iox2_type_variant_e_FIXED_SIZE;
816
817 const auto result = iox2_service_builder_request_response_set_request_payload_type_details(
818 &m_handle,
819 type_variant,
820 payload_type_name.unchecked_access().c_str(),
821 payload_type_name.size(),
822 sizeof(ValueType),
823 alignof(ValueType));
824
825 if (result != IOX2_OK) {
826 IOX2_PANIC("This should never happen! Implementation failure while setting the RequestPayload-Type.");
827 }
828}
829
830template <typename RequestPayload,
831 typename RequestUserHeader,
832 typename ResponsePayload,
833 typename ResponseUserHeader,
834 ServiceType S>
835inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
836 override_request_payload_type_details(const TypeDetail& value) {
837 // request payload type details provided at runtime
838 const auto type_variant =
839 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
840
841 const auto result = iox2_service_builder_request_response_set_request_payload_type_details(
842 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
843
844 if (result != IOX2_OK) {
845 IOX2_PANIC("This should never happen! Implementation failure while setting the RequestPayload-Type.");
846 }
847}
848
849template <typename RequestPayload,
850 typename RequestUserHeader,
851 typename ResponsePayload,
852 typename ResponseUserHeader,
853 ServiceType S>
854inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
855 derive_response_payload_type_details() {
856 using ValueType = typename PayloadInfo<ResponsePayload>::ValueType;
857
858 // response payload type details derived from the compile-time ResponsePayload
859 const auto payload_type_name = internal::get_type_name<ResponsePayload>();
860 const auto type_variant =
861 bb::IsSlice<ResponsePayload>::VALUE ? iox2_type_variant_e_DYNAMIC : iox2_type_variant_e_FIXED_SIZE;
862
863 const auto result = iox2_service_builder_request_response_set_response_payload_type_details(
864 &m_handle,
865 type_variant,
866 payload_type_name.unchecked_access().c_str(),
867 payload_type_name.size(),
868 sizeof(ValueType),
869 alignof(ValueType));
870
871 if (result != IOX2_OK) {
872 IOX2_PANIC("This should never happen! Implementation failure while setting the ResponsePayload-Type.");
873 }
874}
875
876template <typename RequestPayload,
877 typename RequestUserHeader,
878 typename ResponsePayload,
879 typename ResponseUserHeader,
880 ServiceType S>
881inline void ServiceBuilderRequestResponse<RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader, S>::
882 override_response_payload_type_details(const TypeDetail& value) {
883 // response payload type details provided at runtime
884 const auto type_variant =
885 value.variant() == TypeVariant::FixedSize ? iox2_type_variant_e_FIXED_SIZE : iox2_type_variant_e_DYNAMIC;
886
887 const auto result = iox2_service_builder_request_response_set_response_payload_type_details(
888 &m_handle, type_variant, value.type_name(), std::strlen(value.type_name()), value.size(), value.alignment());
889
890 if (result != IOX2_OK) {
891 IOX2_PANIC("This should never happen! Implementation failure while setting the ResponsePayload-Type.");
892 }
893}
894
895template <typename RequestPayload,
896 typename RequestUserHeader,
897 typename ResponsePayload,
898 typename ResponseUserHeader,
899 ServiceType S>
902 const TypeDetail& value) -> std::enable_if_t<std::is_same<RequestUserHeader, CustomHeaderMarker>::value> {
903 builder.m_request_header_type_details_override = bb::Optional<TypeDetail>(value);
904}
905
906template <typename RequestPayload,
907 typename RequestUserHeader,
908 typename ResponsePayload,
909 typename ResponseUserHeader,
910 ServiceType S>
913 const TypeDetail& value) -> std::enable_if_t<std::is_same<ResponseUserHeader, CustomHeaderMarker>::value> {
914 builder.m_response_header_type_details_override = bb::Optional<TypeDetail>(value);
915}
916
917template <typename RequestPayload,
918 typename RequestUserHeader,
919 typename ResponsePayload,
920 typename ResponseUserHeader,
921 ServiceType S>
924 const TypeDetail& value) -> std::enable_if_t<std::is_same<RequestPayload, bb::Slice<CustomPayloadMarker>>::value> {
925 builder.m_request_payload_type_details_override = bb::Optional<TypeDetail>(value);
926}
927
928template <typename RequestPayload,
929 typename RequestUserHeader,
930 typename ResponsePayload,
931 typename ResponseUserHeader,
932 ServiceType S>
935 const TypeDetail& value) -> std::enable_if_t<std::is_same<ResponsePayload, bb::Slice<CustomPayloadMarker>>::value> {
936 builder.m_response_payload_type_details_override = bb::Optional<TypeDetail>(value);
937}
938} // namespace iox2
939#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 response_flatbuffer_schema_path(const bb::FilePath &value) &&-> ServiceBuilderRequestResponse< RequestPayload, RequestUserHeader, U, ResponseUserHeader, S > &&
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 request_flatbuffer_schema_path(const bb::FilePath &value) &&-> ServiceBuilderRequestResponse< U, RequestUserHeader, ResponsePayload, ResponseUserHeader, S > &&
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.
Represents a path to a file. It is not allowed to end with a path separator since this would then be ...
Definition file_path.hpp:44
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