File indexing completed on 2025-12-16 09:40:51
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #ifndef ABSL_FUNCTIONAL_INTERNAL_FUNCTION_REF_H_
0016 #define ABSL_FUNCTIONAL_INTERNAL_FUNCTION_REF_H_
0017
0018 #include <cassert>
0019 #include <functional>
0020 #include <type_traits>
0021
0022 #include "absl/base/internal/invoke.h"
0023 #include "absl/functional/any_invocable.h"
0024 #include "absl/meta/type_traits.h"
0025
0026 namespace absl {
0027 ABSL_NAMESPACE_BEGIN
0028 namespace functional_internal {
0029
0030
0031
0032
0033
0034
0035
0036 union VoidPtr {
0037 const void* obj;
0038 void (*fun)();
0039 };
0040
0041
0042
0043
0044 template <typename T,
0045 bool IsLValueReference = std::is_lvalue_reference<T>::value>
0046 struct PassByValue : std::false_type {};
0047
0048 template <typename T>
0049 struct PassByValue<T, false>
0050 : std::integral_constant<bool,
0051 absl::is_trivially_copy_constructible<T>::value &&
0052 absl::is_trivially_copy_assignable<
0053 typename std::remove_cv<T>::type>::value &&
0054 std::is_trivially_destructible<T>::value &&
0055 sizeof(T) <= 2 * sizeof(void*)> {};
0056
0057 template <typename T>
0058 struct ForwardT : std::conditional<PassByValue<T>::value, T, T&&> {};
0059
0060
0061
0062
0063
0064
0065
0066 template <typename R, typename... Args>
0067 using Invoker = R (*)(VoidPtr, typename ForwardT<Args>::type...);
0068
0069
0070
0071
0072
0073
0074 template <typename Obj, typename R, typename... Args>
0075 R InvokeObject(VoidPtr ptr, typename ForwardT<Args>::type... args) {
0076 auto o = static_cast<const Obj*>(ptr.obj);
0077 return static_cast<R>(
0078 absl::base_internal::invoke(*o, std::forward<Args>(args)...));
0079 }
0080
0081 template <typename Fun, typename R, typename... Args>
0082 R InvokeFunction(VoidPtr ptr, typename ForwardT<Args>::type... args) {
0083 auto f = reinterpret_cast<Fun>(ptr.fun);
0084 return static_cast<R>(
0085 absl::base_internal::invoke(f, std::forward<Args>(args)...));
0086 }
0087
0088 template <typename Sig>
0089 void AssertNonNull(const std::function<Sig>& f) {
0090 assert(f != nullptr);
0091 (void)f;
0092 }
0093
0094 template <typename Sig>
0095 void AssertNonNull(const AnyInvocable<Sig>& f) {
0096 assert(f != nullptr);
0097 (void)f;
0098 }
0099
0100 template <typename F>
0101 void AssertNonNull(const F&) {}
0102
0103 template <typename F, typename C>
0104 void AssertNonNull(F C::*f) {
0105 assert(f != nullptr);
0106 (void)f;
0107 }
0108
0109 template <bool C>
0110 using EnableIf = typename ::std::enable_if<C, int>::type;
0111
0112 }
0113 ABSL_NAMESPACE_END
0114 }
0115
0116 #endif