5#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_FUNCTIONAL_FUNCTION_TRAITS_HPP_
6#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_FUNCTIONAL_FUNCTION_TRAITS_HPP_
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"
39namespace function_traits_detail {
44template <
class R,
class... Args>
45class mixin_function_traits {
48 using return_type = R;
50 using argument_types = type_list<Args...>;
60template <
class Fn,
class =
void>
61class function_traits_impl {};
68template <
class R,
class... Args>
69class function_traits_impl<R(Args...)> :
public mixin_function_traits<R, Args...> {
72 static constexpr auto member_function_cv_qualifier = cv_qualifier::unqualified;
74 static constexpr auto member_function_reference_qualifier = reference_qualifier::unqualified;
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...)> {};
91template <
class R,
class... Args>
92class function_traits_impl<R(Args...)&> :
public mixin_function_traits<R, Args...> {
95 static constexpr auto member_function_cv_qualifier = cv_qualifier::unqualified;
97 static constexpr auto member_function_reference_qualifier = reference_qualifier::lvalue_qualified;
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...)&> {};
114template <
class R,
class... Args>
115class function_traits_impl<R(Args...) &&> :
public mixin_function_traits<R, Args...> {
118 static constexpr auto member_function_cv_qualifier = cv_qualifier::unqualified;
120 static constexpr auto member_function_reference_qualifier = reference_qualifier::rvalue_qualified;
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...) &&> {};
137template <
class R,
class... Args>
138class function_traits_impl<R(Args...)
const> :
public mixin_function_traits<R, Args...> {
141 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_qualified;
143 static constexpr auto member_function_reference_qualifier = reference_qualifier::unqualified;
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> {};
160template <
class R,
class... Args>
161class function_traits_impl<R(Args...)
const&> :
public mixin_function_traits<R, Args...> {
164 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_qualified;
166 static constexpr auto member_function_reference_qualifier = reference_qualifier::lvalue_qualified;
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&> {};
183template <
class R,
class... Args>
184class function_traits_impl<R(Args...)
const&&> :
public mixin_function_traits<R, Args...> {
187 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_qualified;
189 static constexpr auto member_function_reference_qualifier = reference_qualifier::rvalue_qualified;
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&&> {};
208template <
class R,
class... Args>
209class function_traits_impl<R(Args...)
volatile> :
public mixin_function_traits<R, Args...> {
212 static constexpr auto member_function_cv_qualifier = cv_qualifier::volatile_qualified;
214 static constexpr auto member_function_reference_qualifier = reference_qualifier::unqualified;
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> {};
231template <
class R,
class... Args>
232class function_traits_impl<R(Args...)
volatile&> :
public mixin_function_traits<R, Args...> {
235 static constexpr auto member_function_cv_qualifier = cv_qualifier::volatile_qualified;
237 static constexpr auto member_function_reference_qualifier = reference_qualifier::lvalue_qualified;
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&> {};
254template <
class R,
class... Args>
255class function_traits_impl<R(Args...)
volatile&&> :
public mixin_function_traits<R, Args...> {
258 static constexpr auto member_function_cv_qualifier = cv_qualifier::volatile_qualified;
260 static constexpr auto member_function_reference_qualifier = reference_qualifier::rvalue_qualified;
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&&> {};
277template <
class R,
class... Args>
278class function_traits_impl<R(Args...)
const volatile> :
public mixin_function_traits<R, Args...> {
281 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_volatile_qualified;
283 static constexpr auto member_function_reference_qualifier = reference_qualifier::unqualified;
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> {};
300template <
class R,
class... Args>
301class function_traits_impl<R(Args...)
const volatile&> :
public mixin_function_traits<R, Args...> {
304 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_volatile_qualified;
306 static constexpr auto member_function_reference_qualifier = reference_qualifier::lvalue_qualified;
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&> {};
325template <
class R,
class... Args>
326class function_traits_impl<R(Args...)
const volatile&&> :
public mixin_function_traits<R, Args...> {
329 static constexpr auto member_function_cv_qualifier = cv_qualifier::const_volatile_qualified;
331 static constexpr auto member_function_reference_qualifier = reference_qualifier::rvalue_qualified;
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&&> {};
352class member_pointer_traits_impl {};
357template <
class T,
class P>
358class member_pointer_traits_impl<P T::*> {
361 using class_type = T;
363 using pointee_type = P;
371struct add_cv_qualifier;
386 using type = T
const;
396 using type = T
volatile;
404 using type = T
const volatile;
413using add_cv_qualifier_t =
typename add_cv_qualifier<T, CVQual>::type;
421struct add_reference_qualifier;
451using add_reference_qualifier_t =
typename add_reference_qualifier<T, RefQual>::type;
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