7#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_FUNCTIONAL_INVOKE_HPP_
8#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_FUNCTIONAL_INVOKE_HPP_
14#include "arene/base/constraints/constraints.hpp"
15#include "arene/base/stdlib_choice/enable_if.hpp"
16#include "arene/base/stdlib_choice/forward.hpp"
17#include "arene/base/stdlib_choice/is_base_of.hpp"
18#include "arene/base/stdlib_choice/is_member_function_pointer.hpp"
19#include "arene/base/stdlib_choice/is_member_object_pointer.hpp"
20#include "arene/base/stdlib_choice/remove_cv.hpp"
21#include "arene/base/stdlib_choice/remove_reference.hpp"
22#include "arene/base/type_traits/is_invocable.hpp"
23#include "arene/base/type_traits/is_reference_wrapper.hpp"
24#include "arene/base/type_traits/member_pointer_class_type.hpp"
25#include "arene/base/type_traits/remove_cvref.hpp"
35namespace invoke_detail {
51 std::enable_if_t<!std::is_member_function_pointer<std::remove_reference_t<F>>::value>,
52 std::enable_if_t<!std::is_member_object_pointer<std::remove_reference_t<F>>::value>> =
nullptr>
53constexpr auto invoke_impl(F&& func, Args&&... args)
noexcept(
noexcept(std::forward<F>(func)(std::forward<Args>(args)...
54))) ->
decltype(std::forward<F>(func)(std::forward<Args>(args)...)) {
61 return std::forward<F>(func)(std::forward<Args>(args)...);
89 constraints<std::enable_if_t<is_reference_wrapper_v<remove_cvref_t<Object>>>> =
nullptr>
90auto invoke_member_function_impl(F func, Object object, Args&&... args)
noexcept(
91 noexcept((object.get().*func)(std::forward<Args>(args)...))
92) ->
decltype((object.get().*func)(std::forward<Args>(args)...)) {
93 return (object.get().*func)(std::forward<Args>(args)...);
113 constraints<std::enable_if_t<std::is_base_of<member_pointer_class_type<F>, remove_cvref_t<Object>>::value>> =
115constexpr auto invoke_member_function_impl(F func, Object&& object, Args&&... args)
noexcept(
116 noexcept((std::forward<Object>(object).*func)(std::forward<Args>(args)...))
117) ->
decltype((std::forward<Object>(object).*func)(std::forward<Args>(args)...)) {
118 return (std::forward<Object>(object).*func)(std::forward<Args>(args)...);
130 std::enable_if_t<!std::is_base_of<member_pointer_class_type<F>, remove_cvref_t<Object>>::value>,
131 std::enable_if_t<!is_reference_wrapper_v<remove_cvref_t<Object>>>> =
nullptr>
132constexpr auto invoke_member_function_impl(F func, Object&& object, Args&&... args)
noexcept(
133 noexcept(((*std::forward<Object>(object)).*func)(std::forward<Args>(args)...))
134) ->
decltype(((*std::forward<Object>(object)).*func)(std::forward<Args>(args)...)) {
135 return ((*std::forward<Object>(object)).*func)(std::forward<Args>(args)...);
158 constraints<std::enable_if_t<std::is_member_function_pointer<std::remove_reference_t<F>>::value>> =
nullptr>
159constexpr auto invoke_impl(F&& func, Object&& object, Args&&... args)
noexcept(
noexcept(
160 invoke_member_function_impl(std::forward<F>(func), std::forward<Object>(object), std::forward<Args>(args)...)
162 ->
decltype(invoke_member_function_impl(
163 std::forward<F>(func),
164 std::forward<Object>(object),
165 std::forward<Args>(args)...
167 return invoke_member_function_impl(std::forward<F>(func), std::forward<Object>(object), std::forward<Args>(args)...);
183 constraints<std::enable_if_t<std::is_base_of<member_pointer_class_type<F>, remove_cvref_t<Object>>::value>> =
185constexpr auto invoke_data_member_impl(F func, Object&& object)
noexcept
186 ->
decltype(std::forward<Object>(object).*func) {
187 return std::forward<Object>(object).*func;
201 std::enable_if_t<!std::is_base_of<member_pointer_class_type<F>, remove_cvref_t<Object>>::value>,
202 std::enable_if_t<!is_reference_wrapper_v<remove_cvref_t<Object>>>> =
nullptr>
203constexpr auto invoke_data_member_impl(F func, Object&& object)
noexcept(
noexcept((*std::forward<Object>(object)).*func)
204) ->
decltype((*std::forward<Object>(object)).*func) {
211 return (*std::forward<Object>(object)).*func;
237 constraints<std::enable_if_t<is_reference_wrapper_v<remove_cvref_t<Object>>>> =
nullptr>
238auto invoke_data_member_impl(F func, Object object)
noexcept ->
decltype(object.get().*func) {
239 return object.get().*func;
257 constraints<std::enable_if_t<std::is_member_object_pointer<std::remove_reference_t<F>>::value>> =
nullptr>
258constexpr auto invoke_impl(F&& func, Object&& object)
noexcept(
259 noexcept(invoke_data_member_impl(std::forward<F>(func), std::forward<Object>(object)))
260) ->
decltype(invoke_data_member_impl(std::forward<F>(func), std::forward<Object>(object))) {
261 return invoke_data_member_impl(std::forward<F>(func), std::forward<Object>(object));
Definition array_exceptions_disabled.cpp:11
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10