Arene Base
Fundamental Utilities For Safety Critical C++
Loading...
Searching...
No Matches
function_traits.hpp
Go to the documentation of this file.
1// Copyright 2026, Toyota Motor Corporation
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4
5#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_FUNCTIONAL_FUNCTION_TRAITS_HPP_
6#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_FUNCTIONAL_FUNCTION_TRAITS_HPP_
7
8// IWYU pragma: private, include "arene/base/functional.hpp"
9// IWYU pragma: friend "(arene/base(?!/tests)|stdlib/include/stdlib_detail)/.*"
10
11// parasoft-begin-suppress AUTOSAR-A16_2_2-a-2 "Arene Base aggregate headers permitted by A16-2-2 Permit #1"
12#include "arene/base/functional/is_noexcept_part_of_function_type.hpp"
13#include "arene/base/stdlib_choice/cstdint.hpp"
14#include "arene/base/stdlib_choice/enable_if.hpp"
15#include "arene/base/stdlib_choice/integral_constant.hpp"
16#include "arene/base/stdlib_choice/remove_cv.hpp"
17#include "arene/base/type_list/type_list.hpp"
18
19namespace arene {
20namespace base {
21
22/// @brief Denotes the cv-qualification
23/// Specficially for member function pointers
30
31/// @brief Denotes the reference-qualification
32/// Specficially for member function pointers
38
39namespace function_traits_detail {
40
41/// @brief Provides the return and argument types of a function as member types
42/// @tparam R Function return type
43/// @tparam Args Function argument types
44template <class R, class... Args>
45class mixin_function_traits {
46 public:
47 /// @brief Function return type
48 using return_type = R;
49 /// @brief List of function argument types
50 using argument_types = type_list<Args...>;
51};
52
53// parasoft-begin-suppress AUTOSAR-M11_0_1-a-2 "False positive: this is not 'member data', it is a public property"
54
55/// @brief Determines the return and argument types of a function
56/// @tparam Fn function type
57/// @note This does not provide full support for ref-qualified member functions.
58///
59/// This primary template is empty.
60template <class Fn, class = void>
61class function_traits_impl {};
62
63/// @brief Determines the return and argument types of a function
64/// @tparam R function return type
65/// @tparam Args function argument types
66///
67/// Specialization for member functions without no qualifiers.
68template <class R, class... Args>
69class function_traits_impl<R(Args...)> : public mixin_function_traits<R, Args...> {
70 public:
71 /// @brief Member function cv-qualification
72 static constexpr auto member_function_cv_qualifier = cv_qualifier::unqualified;
73 /// @brief Member function reference-qualification
74 static constexpr auto member_function_reference_qualifier = reference_qualifier::unqualified;
75};
76
77/// @brief Determines the return and argument types of a function
78/// @tparam R function return type
79/// @tparam Args function argument types
80///
81/// Specialization for @c noexcept qualified member functions.
82template <class R, class... Args>
83class function_traits_impl<R(Args...) noexcept, std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
84 : public function_traits_impl<R(Args...)> {};
85
86/// @brief Determines the return and argument types of a function
87/// @tparam R function return type
88/// @tparam Args function argument types
89///
90/// Specialization for member functions without no qualifiers.
91template <class R, class... Args>
92class function_traits_impl<R(Args...)&> : public mixin_function_traits<R, Args...> {
93 public:
94 /// @brief Member function cv-qualification
95 static constexpr auto member_function_cv_qualifier = cv_qualifier::unqualified;
96 /// @brief Member function reference-qualification
97 static constexpr auto member_function_reference_qualifier = reference_qualifier::lvalue_qualified;
98};
99
100/// @brief Determines the return and argument types of a function
101/// @tparam R function return type
102/// @tparam Args function argument types
103///
104/// Specialization for @c noexcept qualified member functions.
105template <class R, class... Args>
106class function_traits_impl<R(Args...) & noexcept, std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
107 : public function_traits_impl<R(Args...)&> {};
108
109/// @brief Determines the return and argument types of a function
110/// @tparam R function return type
111/// @tparam Args function argument types
112///
113/// Specialization for member functions without no qualifiers.
114template <class R, class... Args>
115class function_traits_impl<R(Args...) &&> : public mixin_function_traits<R, Args...> {
116 public:
117 /// @brief Member function cv-qualification
118 static constexpr auto member_function_cv_qualifier = cv_qualifier::unqualified;
119 /// @brief Member function reference-qualification
120 static constexpr auto member_function_reference_qualifier = reference_qualifier::rvalue_qualified;
121};
122
123/// @brief Determines the return and argument types of a function
124/// @tparam R function return type
125/// @tparam Args function argument types
126///
127/// Specialization for @c noexcept qualified member functions.
128template <class R, class... Args>
129class function_traits_impl<R(Args...) && noexcept, std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
130 : public function_traits_impl<R(Args...) &&> {};
131
132/// @brief Determines the return and argument types of a function
133/// @tparam R function return type
134/// @tparam Args function argument types
135///
136/// Specialization for member functions without no qualifiers.
137template <class R, class... Args>
138class function_traits_impl<R(Args...) const> : public mixin_function_traits<R, Args...> {
139 public:
140 /// @brief Member function cv-qualification
141 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_qualified;
142 /// @brief Member function reference-qualification
143 static constexpr auto member_function_reference_qualifier = reference_qualifier::unqualified;
144};
145
146/// @brief Determines the return and argument types of a function
147/// @tparam R function return type
148/// @tparam Args function argument types
149///
150/// Specialization for @c noexcept qualified member functions.
151template <class R, class... Args>
152class function_traits_impl<R(Args...) const noexcept, std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
153 : public function_traits_impl<R(Args...) const> {};
154
155/// @brief Determines the return and argument types of a function
156/// @tparam R function return type
157/// @tparam Args function argument types
158///
159/// Specialization for member functions without no qualifiers.
160template <class R, class... Args>
161class function_traits_impl<R(Args...) const&> : public mixin_function_traits<R, Args...> {
162 public:
163 /// @brief Member function cv-qualification
164 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_qualified;
165 /// @brief Member function reference-qualification
166 static constexpr auto member_function_reference_qualifier = reference_qualifier::lvalue_qualified;
167};
168
169/// @brief Determines the return and argument types of a function
170/// @tparam R function return type
171/// @tparam Args function argument types
172///
173/// Specialization for @c noexcept qualified member functions.
174template <class R, class... Args>
175class function_traits_impl<R(Args...) const & noexcept, std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
176 : public function_traits_impl<R(Args...) const&> {};
177
178/// @brief Determines the return and argument types of a function
179/// @tparam R function return type
180/// @tparam Args function argument types
181///
182/// Specialization for member functions without no qualifiers.
183template <class R, class... Args>
184class function_traits_impl<R(Args...) const&&> : public mixin_function_traits<R, Args...> {
185 public:
186 /// @brief Member function cv-qualification
187 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_qualified;
188 /// @brief Member function reference-qualification
189 static constexpr auto member_function_reference_qualifier = reference_qualifier::rvalue_qualified;
190};
191
192/// @brief Determines the return and argument types of a function
193/// @tparam R function return type
194/// @tparam Args function argument types
195///
196/// Specialization for @c noexcept qualified member functions.
197template <class R, class... Args>
198class function_traits_impl<R(Args...) const && noexcept, std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
199 : public function_traits_impl<R(Args...) const&&> {};
200
201// parasoft-begin-suppress AUTOSAR-A2_11_1-a "volatile keywork necessary for a complete implementation"
202
203/// @brief Determines the return and argument types of a function
204/// @tparam R function return type
205/// @tparam Args function argument types
206///
207/// Specialization for member functions without no qualifiers.
208template <class R, class... Args>
209class function_traits_impl<R(Args...) volatile> : public mixin_function_traits<R, Args...> {
210 public:
211 /// @brief Member function cv-qualification
212 static constexpr auto member_function_cv_qualifier = cv_qualifier::volatile_qualified;
213 /// @brief Member function reference-qualification
214 static constexpr auto member_function_reference_qualifier = reference_qualifier::unqualified;
215};
216
217/// @brief Determines the return and argument types of a function
218/// @tparam R function return type
219/// @tparam Args function argument types
220///
221/// Specialization for @c noexcept qualified member functions.
222template <class R, class... Args>
223class function_traits_impl<R(Args...) volatile noexcept, std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
224 : public function_traits_impl<R(Args...) volatile> {};
225
226/// @brief Determines the return and argument types of a function
227/// @tparam R function return type
228/// @tparam Args function argument types
229///
230/// Specialization for member functions without no qualifiers.
231template <class R, class... Args>
232class function_traits_impl<R(Args...) volatile&> : public mixin_function_traits<R, Args...> {
233 public:
234 /// @brief Member function cv-qualification
235 static constexpr auto member_function_cv_qualifier = cv_qualifier::volatile_qualified;
236 /// @brief Member function reference-qualification
237 static constexpr auto member_function_reference_qualifier = reference_qualifier::lvalue_qualified;
238};
239
240/// @brief Determines the return and argument types of a function
241/// @tparam R function return type
242/// @tparam Args function argument types
243///
244/// Specialization for @c noexcept qualified member functions.
245template <class R, class... Args>
246class function_traits_impl<R(Args...) volatile & noexcept, std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
247 : public function_traits_impl<R(Args...) volatile&> {};
248
249/// @brief Determines the return and argument types of a function
250/// @tparam R function return type
251/// @tparam Args function argument types
252///
253/// Specialization for member functions without no qualifiers.
254template <class R, class... Args>
255class function_traits_impl<R(Args...) volatile&&> : public mixin_function_traits<R, Args...> {
256 public:
257 /// @brief Member function cv-qualification
258 static constexpr auto member_function_cv_qualifier = cv_qualifier::volatile_qualified;
259 /// @brief Member function reference-qualification
260 static constexpr auto member_function_reference_qualifier = reference_qualifier::rvalue_qualified;
261};
262
263/// @brief Determines the return and argument types of a function
264/// @tparam R function return type
265/// @tparam Args function argument types
266///
267/// Specialization for @c noexcept qualified member functions.
268template <class R, class... Args>
269class function_traits_impl<R(Args...) volatile && noexcept, std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
270 : public function_traits_impl<R(Args...) volatile&&> {};
271
272/// @brief Determines the return and argument types of a function
273/// @tparam R function return type
274/// @tparam Args function argument types
275///
276/// Specialization for member functions without no qualifiers.
277template <class R, class... Args>
278class function_traits_impl<R(Args...) const volatile> : public mixin_function_traits<R, Args...> {
279 public:
280 /// @brief Member function cv-qualification
281 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_volatile_qualified;
282 /// @brief Member function reference-qualification
283 static constexpr auto member_function_reference_qualifier = reference_qualifier::unqualified;
284};
285
286/// @brief Determines the return and argument types of a function
287/// @tparam R function return type
288/// @tparam Args function argument types
289///
290/// Specialization for @c noexcept qualified member functions.
291template <class R, class... Args>
292class function_traits_impl<R(Args...) const volatile noexcept, std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
293 : public function_traits_impl<R(Args...) const volatile> {};
294
295/// @brief Determines the return and argument types of a function
296/// @tparam R function return type
297/// @tparam Args function argument types
298///
299/// Specialization for member functions without no qualifiers.
300template <class R, class... Args>
301class function_traits_impl<R(Args...) const volatile&> : public mixin_function_traits<R, Args...> {
302 public:
303 /// @brief Member function cv-qualification
304 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_volatile_qualified;
305 /// @brief Member function reference-qualification
306 static constexpr auto member_function_reference_qualifier = reference_qualifier::lvalue_qualified;
307};
308
309/// @brief Determines the return and argument types of a function
310/// @tparam R function return type
311/// @tparam Args function argument types
312///
313/// Specialization for @c noexcept qualified member functions.
314template <class R, class... Args>
315class function_traits_impl<
316 R(Args...) const volatile & noexcept,
317 std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
318 : public function_traits_impl<R(Args...) const volatile&> {};
319
320/// @brief Determines the return and argument types of a function
321/// @tparam R function return type
322/// @tparam Args function argument types
323///
324/// Specialization for member functions without no qualifiers.
325template <class R, class... Args>
326class function_traits_impl<R(Args...) const volatile&&> : public mixin_function_traits<R, Args...> {
327 public:
328 /// @brief Member function cv-qualification
329 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_volatile_qualified;
330 /// @brief Member function reference-qualification
331 static constexpr auto member_function_reference_qualifier = reference_qualifier::rvalue_qualified;
332};
333
334/// @brief Determines the return and argument types of a function
335/// @tparam R function return type
336/// @tparam Args function argument types
337///
338/// Specialization for @c noexcept qualified member functions.
339template <class R, class... Args>
340class function_traits_impl<
341 R(Args...) const volatile && noexcept,
342 std::enable_if_t<is_noexcept_part_of_function_type_v<R>>>
343 : public function_traits_impl<R(Args...) const volatile&&> {};
344
345// parasoft-end-suppress AUTOSAR-A2_11_1-a
346// parasoft-end-suppress AUTOSAR-M11_0_1-a-2
347
348/// @brief Provides aliases to the class and pointer type of a member pointer
349///
350/// This primary template is empty.
351template <class F>
352class member_pointer_traits_impl {};
353
354/// @brief Provides aliases to the class and pointer type of a member pointer
355/// @tparam T class type of a member pointer
356/// @tparam P pointer type of a member pointer
357template <class T, class P>
358class member_pointer_traits_impl<P T::*> {
359 public:
360 /// @brief Associated class type
361 using class_type = T;
362 /// @brief Type pointed to for a pointer to member object or pointer to member function
363 using pointee_type = P;
364};
365
366/// @brief Modify a type by the cv qualifier given by an enum, accessible as @c type
367/// Undefined base for specialization
368/// @tparam T Type to modify
369/// @tparam CVQual Enum representing the cv qualifier to add
370template <class T, cv_qualifier CVQual>
371struct add_cv_qualifier;
372
373/// @brief Specialization for no cv qualifier
374/// @tparam T Type to modify
375template <class T>
376struct add_cv_qualifier<T, cv_qualifier::unqualified> {
377 /// @brief Unqualified type
378 using type = T;
379};
380
381/// @brief Specialization for @c const cv qualifier
382/// @tparam T Type to modify
383template <class T>
384struct add_cv_qualifier<T, cv_qualifier::const_qualified> {
385 /// @brief @c const qualified type
386 using type = T const;
387};
388
389// parasoft-begin-suppress AUTOSAR-A2_11_1-a "volatile keywork necessary for a complete implementation"
390
391/// @brief Specialization for @c volatile cv qualifier
392/// @tparam T Type to modify
393template <class T>
394struct add_cv_qualifier<T, cv_qualifier::volatile_qualified> {
395 /// @brief @c volatile qualified type
396 using type = T volatile;
397};
398
399/// @brief Specialization for @c const @c volatile cv qualifier
400/// @tparam T Type to modify
401template <class T>
402struct add_cv_qualifier<T, cv_qualifier::const_volatile_qualified> {
403 /// @brief @c const @c volatile qualified type
404 using type = T const volatile;
405};
406
407// parasoft-end-suppress AUTOSAR-A2_11_1-a
408
409/// @brief Modify a type by the cv qualifier given by an enum
410/// @tparam T Type to modify
411/// @tparam CVQual Enum representing the cv qualifier to add
412template <class T, cv_qualifier CVQual>
413using add_cv_qualifier_t = typename add_cv_qualifier<T, CVQual>::type;
414
415/// @brief Modify a type by the reference qualifier given by an enum,
416/// accessable as @c type
417/// Undefined base for specialization
418/// @tparam T Type to modify
419/// @tparam RefQual Enum representing the reference qualifier to add
420template <class T, reference_qualifier RefQual>
421struct add_reference_qualifier;
422
423/// @brief Specialization for no reference qualifier
424/// @tparam T Type to modify
425template <class T>
426struct add_reference_qualifier<T, reference_qualifier::unqualified> {
427 /// @brief Unqualified type
428 using type = T;
429};
430
431/// @brief Specialization for lvalue reference qualifier
432/// @tparam T Type to modify
433template <class T>
434struct add_reference_qualifier<T, reference_qualifier::lvalue_qualified> {
435 /// @brief lvalue qualified type
436 using type = T&;
437};
438
439/// @brief Specialization for rvalue reference qualifier
440/// @tparam T Type to modify
441template <class T>
442struct add_reference_qualifier<T, reference_qualifier::rvalue_qualified> {
443 /// @brief rvalue qualified type
444 using type = T&&;
445};
446
447/// @brief Modify a type by the reference qualifier given by an enum
448/// @tparam T Type to modify
449/// @tparam RefQual Enum representing the reference qualifier to add
450template <class T, reference_qualifier RefQual>
451using add_reference_qualifier_t = typename add_reference_qualifier<T, RefQual>::type;
452
453} // namespace function_traits_detail
454
455/// @brief Contains the @c return_type, @c argument_type, and @c cv_qualifier
456/// of the given function type
457/// @tparam Fn Function type to build traits from
458template <class Fn>
460
461/// @brief Determines the return and argument types of a function
462/// @tparam Fn function type
463template <class Fn>
465
466/// @brief Determines the argument types of a function
467/// @tparam Fn function type
468template <class Fn>
470
471/// @brief Contains the @c class_type and @c pointee_type of the given member pointer
472/// @tparam F member pointer type
473template <class F>
475
476/// @brief Contains the types within @c function_traits and
477/// @c member_pointer_traits for a member function pointer
478/// @tparam F member function pointer type
479template <class F>
481 : public member_pointer_traits<F>
483 /// @brief Parent alias for easy access
485 /// @brief Parent alias for easy access
487
488 public:
489 /// @brief Implicit argument to the member function pointer which is the
490 /// class with cv and reference qualifiers matching the member function
495};
496
497// parasoft-begin-suppress AUTOSAR-A2_7_3-a "False positive: the typedef *is* preceded by a comment with @brief"
498/// @brief Obtains the return type of a member function pointer type
499/// @tparam F member function pointer type
500template <class F>
502// parasoft-end-suppress AUTOSAR-A2_7_3-a
503
504/// @brief Obtains the argument types of a member function pointer type
505/// @tparam F member function pointer type
506template <class F>
508
509/// @brief Obtains the cv-qualification of a member function pointer type
510/// @tparam F member function pointer type
511template <class F>
516
517/// @brief Obtains the reference-qualification of a member function pointer type
518/// @tparam F member function pointer type
519template <class F>
524
525/// @brief An enum representing the cv-qualification of a member function pointer type
526/// @tparam F member function pointer type
527template <class F>
529
530/// @brief An enum representing the reference-qualification of a member function pointer type
531/// @tparam F member function pointer type
532template <class F>
534
535} // namespace base
536} // namespace arene
537
538#endif // INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_FUNCTIONAL_FUNCTION_TRAITS_HPP_
Obtains the cv-qualification of a member function pointer type.
Definition function_traits.hpp:515
Contains the types within function_traits and member_pointer_traits for a member function pointer.
Definition function_traits.hpp:482
Obtains the reference-qualification of a member function pointer type.
Definition function_traits.hpp:523
Definition array_exceptions_disabled.cpp:11
reference_qualifier
Denotes the reference-qualification Specficially for member function pointers.
Definition function_traits.hpp:33
@ lvalue_qualified
Definition function_traits.hpp:35
@ rvalue_qualified
Definition function_traits.hpp:36
@ unqualified
Definition function_traits.hpp:34
cv_qualifier
Denotes the cv-qualification Specficially for member function pointers.
Definition function_traits.hpp:24
@ volatile_qualified
Definition function_traits.hpp:27
@ const_volatile_qualified
Definition function_traits.hpp:28
@ const_qualified
Definition function_traits.hpp:26
@ unqualified
Definition function_traits.hpp:25
static constexpr auto member_function_cv_v
An enum representing the cv-qualification of a member function pointer type.
Definition function_traits.hpp:528
static constexpr auto member_function_reference_v
An enum representing the reference-qualification of a member function pointer type.
Definition function_traits.hpp:533
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10