iceoryx2
C++ Language Bindings
Loading...
Searching...
No Matches
service_builder_internal.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_INTERNAL_HPP
14#define IOX2_SERVICE_BUILDER_INTERNAL_HPP
15
16#include "iox2/bb/slice.hpp"
19#include "iox2/payload_info.hpp"
20#include "iox2/type_name.hpp"
21
22#include <cstdio>
23#include <typeinfo>
24
25namespace iox2 {
26namespace internal {
27
28template <typename>
29auto get_type_name() -> TypeName;
30
31template <typename Payload, typename = void>
32struct HasPayloadTypeNameMember : std::false_type { };
33
34template <typename Payload>
35struct HasPayloadTypeNameMember<Payload, decltype((void) Payload::IOX2_TYPE_NAME)> : std::true_type { };
36
37template <typename Payload, typename = void>
38struct HasPayloadTypeNameSpecialization : std::false_type { };
39
40template <typename Payload>
41struct HasPayloadTypeNameSpecialization<Payload, decltype((void) TypeNameSpecialization<Payload>::value())>
42 : std::true_type { };
43
44template <typename Payload>
45using FromPayloadTypeNameSpecialization = std::enable_if_t<HasPayloadTypeNameSpecialization<Payload>::value, TypeName>;
46
47template <typename Payload>
49 std::enable_if_t<!HasPayloadTypeNameSpecialization<Payload>::value && HasPayloadTypeNameMember<Payload>::value,
50 TypeName>;
51
52template <typename Payload>
54 std::enable_if_t<!HasPayloadTypeNameSpecialization<Payload>::value && !HasPayloadTypeNameMember<Payload>::value
57 TypeName>;
58
59template <typename Payload>
61 std::enable_if_t<!HasPayloadTypeNameSpecialization<Payload>::value && iox2::bb::IsStaticVector<Payload>::value,
62 TypeName>;
63
64template <typename Payload>
66 std::enable_if_t<!HasPayloadTypeNameSpecialization<Payload>::value && iox2::bb::IsStaticString<Payload>::value,
67 TypeName>;
68
69template <typename Payload>
71 std::enable_if_t<!HasPayloadTypeNameSpecialization<Payload>::value && !HasPayloadTypeNameMember<Payload>::value
73 TypeName>;
74
75template <typename Payload>
77 std::enable_if_t<!HasPayloadTypeNameSpecialization<Payload>::value && !HasPayloadTypeNameMember<Payload>::value
80 TypeName>;
81
82template <typename PayloadType>
85 "A type must not define both an iox2::TypeNameSpecialization and an IOX2_TYPE_NAME "
86 "member. Choose exactly one source for the type name.");
87
89}
90
91template <typename PayloadType>
93 return *TypeName::from_utf8_null_terminated_unchecked(PayloadType::IOX2_TYPE_NAME);
94}
95
96template <typename PayloadType>
97auto get_type_name_impl() -> internal::FromStaticString<PayloadType> {
98 // std::array is not available in this safety-critical context
99 // NOLINTNEXTLINE
100 char type_name[TypeName::capacity()] { 0 };
101 // std::to_string() is not available in this safety-critical context
102 // NOLINTNEXTLINE
103 snprintf(&type_name[0],
105 "iceoryx2_bb_container::string::static_string::StaticString<%llu>",
106 static_cast<long long unsigned int>(PayloadType::capacity()));
108}
109
110template <typename PayloadType>
111auto get_type_name_impl() -> internal::FromStaticVector<PayloadType> {
112 // std::array is not available in this safety-critical context
113 // NOLINTNEXTLINE
114 char type_name[TypeName::capacity()] { 0 };
115 // std::to_string() is not available in this safety-critical context
116 // NOLINTNEXTLINE
117 snprintf(&type_name[0],
119 "iceoryx2_bb_container::vector::static_vec::StaticVec<%s, %llu>",
120 get_type_name<typename PayloadType::ValueType>().unchecked_access().c_str(),
121 static_cast<long long unsigned int>(PayloadType::capacity()));
123}
124
125// NOLINTBEGIN(readability-function-size) : template alternative is less readable
126template <typename PayloadType>
127auto get_type_name_impl() -> internal::FromNonSlice<PayloadType> {
128 if (std::is_same<PayloadType, void>::value) {
129 return *TypeName::from_utf8("()");
130 }
131 if (std::is_same<PayloadType, uint8_t>::value) {
132 return *TypeName::from_utf8("u8");
133 }
134 if (std::is_same<PayloadType, uint16_t>::value) {
135 return *TypeName::from_utf8("u16");
136 }
137 if (std::is_same<PayloadType, uint32_t>::value) {
138 return *TypeName::from_utf8("u32");
139 }
140 if (std::is_same<PayloadType, uint64_t>::value) {
141 return *TypeName::from_utf8("u64");
142 }
143 if (std::is_same<PayloadType, int8_t>::value) {
144 return *TypeName::from_utf8("i8");
145 }
146 if (std::is_same<PayloadType, int16_t>::value) {
147 return *TypeName::from_utf8("i16");
148 }
149 if (std::is_same<PayloadType, int32_t>::value) {
150 return *TypeName::from_utf8("i32");
151 }
152 if (std::is_same<PayloadType, int64_t>::value) {
153 return *TypeName::from_utf8("i64");
154 }
155 if (std::is_same<PayloadType, float>::value) {
156 return *TypeName::from_utf8("f32");
157 }
158 if (std::is_same<PayloadType, double>::value) {
159 return *TypeName::from_utf8("f64");
160 }
161
162 // std::array is not available in this safety-critical context
163 // NOLINTNEXTLINE
164 char type_name[TypeName::capacity()] { 0 };
165 // std::to_string() is not available in this safety-critical context
166 // NOLINTNEXTLINE
167 snprintf(&type_name[0],
169 "__cxx__abi__%s",
170 typeid(typename PayloadInfo<PayloadType>::ValueType).name());
171
173}
174// NOLINTEND(readability-function-size)
175
176template <typename PayloadType>
177auto get_type_name_impl() -> internal::FromSliceWithInnerPayloadTypeNameMember<PayloadType> {
178 return *TypeName::from_utf8_null_terminated_unchecked(PayloadType::ValueType::IOX2_TYPE_NAME);
179}
180
181template <typename PayloadType>
182auto get_type_name_impl() -> internal::FromSliceWithoutInnerPayloadTypeNameMember<PayloadType> {
183 return get_type_name_impl<typename PayloadType::ValueType>();
184}
185
186template <typename PayloadType>
188 return get_type_name_impl<PayloadType>();
189}
190
191} // namespace internal
192} // namespace iox2
193
194#endif
static auto from_utf8(char const (&utf8_str)[M]) noexcept -> bb::Optional< StaticString >
static constexpr auto capacity() noexcept -> SizeType
static auto from_utf8_null_terminated_unchecked(char const *utf8_str) -> bb::Optional< StaticString >
std::enable_if_t<!HasPayloadTypeNameSpecialization< Payload >::value &&iox2::bb::IsStaticVector< Payload >::value, TypeName > FromStaticVector
std::enable_if_t<!HasPayloadTypeNameSpecialization< Payload >::value &&HasPayloadTypeNameMember< Payload >::value, TypeName > FromPayloadTypeNameMember
std::enable_if_t<!HasPayloadTypeNameSpecialization< Payload >::value &&!HasPayloadTypeNameMember< Payload >::value &&bb::IsSlice< Payload >::VALUE &&HasPayloadTypeNameMember< typename Payload::ValueType >::value, TypeName > FromSliceWithInnerPayloadTypeNameMember
std::enable_if_t<!HasPayloadTypeNameSpecialization< Payload >::value &&!HasPayloadTypeNameMember< Payload >::value &&bb::IsSlice< Payload >::VALUE &&!HasPayloadTypeNameMember< typename Payload::ValueType >::value, TypeName > FromSliceWithoutInnerPayloadTypeNameMember
auto get_type_name_impl() -> internal::FromPayloadTypeNameSpecialization< PayloadType >
std::enable_if_t< HasPayloadTypeNameSpecialization< Payload >::value, TypeName > FromPayloadTypeNameSpecialization
auto get_type_name() -> TypeName
std::enable_if_t<!HasPayloadTypeNameSpecialization< Payload >::value &&iox2::bb::IsStaticString< Payload >::value, TypeName > FromStaticString
std::enable_if_t<!HasPayloadTypeNameSpecialization< Payload >::value &&!HasPayloadTypeNameMember< Payload >::value &&!bb::IsSlice< Payload >::VALUE &&!iox2::bb::IsStaticVector< Payload >::value &&!iox2::bb::IsStaticString< Payload >::value, TypeName > FromNonSlice
iox2::bb::StaticString< IOX2_TYPE_NAME_LENGTH > TypeName
Definition type_name.hpp:21