5 #ifndef EASTL_FUNCTIONAL_H
6 #define EASTL_FUNCTIONAL_H
9 #include <EABase/eabase.h>
10 #include <EASTL/internal/config.h>
11 #include <EASTL/internal/move_help.h>
12 #include <EASTL/type_traits.h>
13 #include <EASTL/internal/functional_base.h>
14 #include <EASTL/internal/mem_fn.h>
17 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
29 template <
typename T =
void>
32 EA_CPP14_CONSTEXPR T operator()(
const T& a,
const T& b)
const
40 typedef int is_transparent;
41 template<
typename A,
typename B>
42 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
43 -> decltype(eastl::forward<A>(a) + eastl::forward<B>(b))
44 {
return eastl::forward<A>(a) + eastl::forward<B>(b); }
47 template <
typename T =
void>
50 EA_CPP14_CONSTEXPR T operator()(
const T& a,
const T& b)
const
58 typedef int is_transparent;
59 template<
typename A,
typename B>
60 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
61 -> decltype(eastl::forward<A>(a) - eastl::forward<B>(b))
62 {
return eastl::forward<A>(a) - eastl::forward<B>(b); }
65 template <
typename T =
void>
68 EA_CPP14_CONSTEXPR T operator()(
const T& a,
const T& b)
const
76 typedef int is_transparent;
77 template<
typename A,
typename B>
78 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
79 -> decltype(eastl::forward<A>(a) * eastl::forward<B>(b))
80 {
return eastl::forward<A>(a) * eastl::forward<B>(b); }
83 template <
typename T =
void>
86 EA_CPP14_CONSTEXPR T operator()(
const T& a,
const T& b)
const
94 typedef int is_transparent;
95 template<
typename A,
typename B>
96 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
97 -> decltype(eastl::forward<A>(a) / eastl::forward<B>(b))
98 {
return eastl::forward<A>(a) / eastl::forward<B>(b); }
101 template <
typename T =
void>
104 EA_CPP14_CONSTEXPR T operator()(
const T& a,
const T& b)
const
112 typedef int is_transparent;
113 template<
typename A,
typename B>
114 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
115 -> decltype(eastl::forward<A>(a) % eastl::forward<B>(b))
116 {
return eastl::forward<A>(a) % eastl::forward<B>(b); }
119 template <
typename T =
void>
122 EA_CPP14_CONSTEXPR T operator()(
const T& a)
const
130 typedef int is_transparent;
132 EA_CPP14_CONSTEXPR
auto operator()(T&& t)
const
133 -> decltype(-eastl::forward<T>(t))
134 {
return -eastl::forward<T>(t); }
137 template <
typename T =
void>
140 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const T& b)
const
148 typedef int is_transparent;
149 template<
typename A,
typename B>
150 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
151 -> decltype(eastl::forward<A>(a) == eastl::forward<B>(b))
152 {
return eastl::forward<A>(a) == eastl::forward<B>(b); }
155 template <
typename T,
typename Compare>
156 bool validate_equal_to(
const T& a,
const T& b, Compare compare)
158 return compare(a, b) == compare(b, a);
161 template <
typename T =
void>
164 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const T& b)
const
172 typedef int is_transparent;
173 template<
typename A,
typename B>
174 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
175 -> decltype(eastl::forward<A>(a) != eastl::forward<B>(b))
176 {
return eastl::forward<A>(a) != eastl::forward<B>(b); }
179 template <
typename T,
typename Compare>
180 bool validate_not_equal_to(
const T& a,
const T& b, Compare compare)
182 return compare(a, b) == compare(b, a);
203 template <
typename T>
206 EA_CPP14_CONSTEXPR
bool operator()(T a, T b)
const
208 while(*a && (*a == *b))
217 template <
typename T =
void>
220 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const T& b)
const
228 template<
typename A,
typename B>
229 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
230 -> decltype(eastl::forward<A>(a) > eastl::forward<B>(b))
231 {
return eastl::forward<A>(a) > eastl::forward<B>(b); }
234 template <
typename T,
typename Compare>
235 bool validate_greater(
const T& a,
const T& b, Compare compare)
237 return !compare(a, b) || !compare(b, a);
241 template <
typename T,
typename Compare>
242 bool validate_less(
const T& a,
const T& b, Compare compare)
244 return !compare(a, b) || !compare(b, a);
262 template <
typename T>
265 bool operator()(T a, T b)
const
276 char aValue =
static_cast<typename remove_pointer<T>::type
>(*a);
277 char bValue =
static_cast<typename remove_pointer<T>::type
>(*b);
279 typename make_unsigned<char>::type aValueU =
static_cast<typename make_unsigned<char>::type
>(aValue);
280 typename make_unsigned<char>::type bValueU =
static_cast<typename make_unsigned<char>::type
>(bValue);
282 return aValueU < bValueU;
289 template <
typename T =
void>
292 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const T& b)
const
300 template<
typename A,
typename B>
301 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
302 -> decltype(eastl::forward<A>(a) >= eastl::forward<B>(b))
303 {
return eastl::forward<A>(a) >= eastl::forward<B>(b); }
306 template <
typename T,
typename Compare>
307 bool validate_greater_equal(
const T& a,
const T& b, Compare compare)
309 return !compare(a, b) || !compare(b, a);
312 template <
typename T =
void>
315 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const T& b)
const
323 template<
typename A,
typename B>
324 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
325 -> decltype(eastl::forward<A>(a) <= eastl::forward<B>(b))
326 {
return eastl::forward<A>(a) <= eastl::forward<B>(b); }
329 template <
typename T,
typename Compare>
330 bool validate_less_equal(
const T& a,
const T& b, Compare compare)
332 return !compare(a, b) || !compare(b, a);
335 template <
typename T =
void>
338 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const T& b)
const
346 template<
typename A,
typename B>
347 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
348 -> decltype(eastl::forward<A>(a) && eastl::forward<B>(b))
349 {
return eastl::forward<A>(a) && eastl::forward<B>(b); }
352 template <
typename T =
void>
355 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const T& b)
const
363 template<
typename A,
typename B>
364 EA_CPP14_CONSTEXPR
auto operator()(A&& a, B&& b)
const
365 -> decltype(eastl::forward<A>(a) || eastl::forward<B>(b))
366 {
return eastl::forward<A>(a) || eastl::forward<B>(b); }
369 template <
typename T =
void>
372 EA_CPP14_CONSTEXPR
bool operator()(
const T& a)
const
381 EA_CPP14_CONSTEXPR
auto operator()(T&& t)
const
382 -> decltype(!eastl::forward<T>(t))
383 {
return !eastl::forward<T>(t); }
393 template <
typename T,
typename U>
396 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const U& b)
const
399 template <
typename T_ = T,
typename U_ = U,
typename = eastl::enable_if_t<!eastl::is_same_v<eastl::remove_const_t<T_>, eastl::remove_const_t<U_>>>>
400 EA_CPP14_CONSTEXPR
bool operator()(
const U& b,
const T& a)
const
404 template <
typename T,
typename U>
407 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const U& b)
const
410 template <
typename T_ = T,
typename U_ = U,
typename = eastl::enable_if_t<!eastl::is_same_v<eastl::remove_const_t<T_>, eastl::remove_const_t<U_>>>>
411 EA_CPP14_CONSTEXPR
bool operator()(
const U& b,
const T& a)
const
416 template <
typename T,
typename U>
419 EA_CPP14_CONSTEXPR
bool operator()(
const T& a,
const U& b)
const
422 template <
typename T_ = T,
typename U_ = U,
typename = eastl::enable_if_t<!eastl::is_same_v<eastl::remove_const_t<T_>, eastl::remove_const_t<U_>>>>
423 EA_CPP14_CONSTEXPR
bool operator()(
const U& b,
const T& a)
const
430 template <
typename Predicate>
434 Predicate mPredicate;
438 EA_CPP14_CONSTEXPR
bool operator()(
const typename Predicate::argument_type& a)
const
439 {
return !mPredicate(a); }
442 template <
typename Predicate>
450 template <
typename Predicate>
454 Predicate mPredicate;
458 EA_CPP14_CONSTEXPR
bool operator()(
const typename Predicate::first_argument_type& a,
const typename Predicate::second_argument_type& b)
const
459 {
return !mPredicate(a, b); }
462 template <
typename Predicate>
470 template<
typename Operation1,
typename Operation2>
481 typename Operation1::result_type operator()(
const typename Operation2::argument_type& x)
const
482 {
return op1(op2(x)); }
484 typename Operation1::result_type operator()(
typename Operation2::argument_type& x)
const
485 {
return op1(op2(x)); }
488 template<
typename Operation1,
typename Operation2>
490 compose1(
const Operation1& op1,
const Operation2& op2)
498 template <
class Operation1,
class Operation2,
class Operation3>
508 typedef typename Operation2::argument_type first_argument_type;
509 typedef typename Operation3::argument_type second_argument_type;
511 binary_compose(
const Operation1& x,
const Operation2& y,
const Operation3& z)
512 : op1(x), op2(y), op3(z) { }
514 typename Operation1::result_type operator()(
const typename Operation2::argument_type& x)
const
515 {
return op1(op2(x),op3(x)); }
517 typename Operation1::result_type operator()(
typename Operation2::argument_type& x)
const
518 {
return op1(op2(x),op3(x)); }
520 typename Operation1::result_type operator()(
const typename Operation2::argument_type& x,
const typename Operation3::argument_type& y)
const
521 {
return op1(op2(x),op3(y)); }
523 typename Operation1::result_type operator()(
typename Operation2::argument_type& x,
typename Operation3::argument_type& y)
const
524 {
return op1(op2(x),op3(y)); }
528 template <
class Operation1,
class Operation2,
class Operation3>
530 compose2(
const Operation1& op1,
const Operation2& op2,
const Operation3& op3)
552 template <
typename Arg,
typename Result>
556 Result (*mpFunction)(Arg);
563 : mpFunction(pFunction) { }
565 Result operator()(Arg x)
const
566 {
return mpFunction(x); }
578 template <
typename Arg,
typename Result>
597 template <
typename Arg1,
typename Arg2,
typename Result>
601 Result (*mpFunction)(Arg1, Arg2);
608 : mpFunction(pFunction) {}
610 Result operator()(Arg1 x, Arg2 y)
const
611 {
return mpFunction(x, y); }
621 template <
typename Arg1,
typename Arg2,
typename Result>
649 template <
typename Result,
typename T>
653 typedef Result (T::*MemberFunction)();
655 inline explicit mem_fun_t(MemberFunction pMemberFunction)
656 : mpMemberFunction(pMemberFunction)
661 inline Result operator()(T* pT)
const
663 return (pT->*mpMemberFunction)();
667 MemberFunction mpMemberFunction;
675 template <
typename Result,
typename T,
typename Argument>
679 typedef Result (T::*MemberFunction)(Argument);
681 inline explicit mem_fun1_t(MemberFunction pMemberFunction)
682 : mpMemberFunction(pMemberFunction)
687 inline Result operator()(T* pT, Argument arg)
const
689 return (pT->*mpMemberFunction)(arg);
693 MemberFunction mpMemberFunction;
704 template <
typename Result,
typename T>
708 typedef Result (T::*MemberFunction)()
const;
711 : mpMemberFunction(pMemberFunction)
716 inline Result operator()(
const T* pT)
const
718 return (pT->*mpMemberFunction)();
722 MemberFunction mpMemberFunction;
733 template <
typename Result,
typename T,
typename Argument>
737 typedef Result (T::*MemberFunction)(Argument)
const;
740 : mpMemberFunction(pMemberFunction)
745 inline Result operator()(
const T* pT, Argument arg)
const
747 return (pT->*mpMemberFunction)(arg);
751 MemberFunction mpMemberFunction;
766 template <
typename Result,
typename T>
773 template <
typename Result,
typename T,
typename Argument>
774 inline mem_fun1_t<Result, T, Argument>
775 mem_fun(Result (T::*MemberFunction)(Argument))
780 template <
typename Result,
typename T>
781 inline const_mem_fun_t<Result, T>
782 mem_fun(Result (T::*MemberFunction)()
const)
787 template <
typename Result,
typename T,
typename Argument>
788 inline const_mem_fun1_t<Result, T, Argument>
789 mem_fun(Result (T::*MemberFunction)(Argument)
const)
806 template <
typename Result,
typename T>
810 typedef Result (T::*MemberFunction)();
812 inline explicit mem_fun_ref_t(MemberFunction pMemberFunction)
813 : mpMemberFunction(pMemberFunction)
818 inline Result operator()(T& t)
const
820 return (t.*mpMemberFunction)();
824 MemberFunction mpMemberFunction;
830 template <
typename Result,
typename T,
typename Argument>
834 typedef Result (T::*MemberFunction)(Argument);
837 : mpMemberFunction(pMemberFunction)
842 inline Result operator()(T& t, Argument arg)
const
844 return (t.*mpMemberFunction)(arg);
848 MemberFunction mpMemberFunction;
854 template <
typename Result,
typename T>
858 typedef Result (T::*MemberFunction)()
const;
861 : mpMemberFunction(pMemberFunction)
866 inline Result operator()(
const T& t)
const
868 return (t.*mpMemberFunction)();
872 MemberFunction mpMemberFunction;
878 template <
typename Result,
typename T,
typename Argument>
882 typedef Result (T::*MemberFunction)(Argument)
const;
885 : mpMemberFunction(pMemberFunction)
890 inline Result operator()(
const T& t, Argument arg)
const
892 return (t.*mpMemberFunction)(arg);
896 MemberFunction mpMemberFunction;
908 template <
typename Result,
typename T>
915 template <
typename Result,
typename T,
typename Argument>
916 inline mem_fun1_ref_t<Result, T, Argument>
922 template <
typename Result,
typename T>
923 inline const_mem_fun_ref_t<Result, T>
929 template <
typename Result,
typename T,
typename Argument>
930 inline const_mem_fun1_ref_t<Result, T, Argument>
931 mem_fun_ref(Result (T::*MemberFunction)(Argument)
const)
943 template <
typename F>
946 explicit not_fn_ret(F&& f) : mDecayF(eastl::forward<F>(f)) {}
951 template <
class... Args>
952 auto operator()(Args&&... args) &
953 -> decltype(!eastl::declval<eastl::invoke_result_t<eastl::decay_t<F>&, Args...>>())
954 {
return !eastl::invoke(mDecayF, eastl::forward<Args>(args)...); }
956 template <
class... Args>
957 auto operator()(Args&&... args)
const &
958 -> decltype(!eastl::declval<eastl::invoke_result_t<eastl::decay_t<F>
const&, Args...>>())
959 {
return !eastl::invoke(mDecayF, eastl::forward<Args>(args)...); }
962 template <
class... Args>
963 auto operator()(Args&&... args) &&
964 -> decltype(!eastl::declval<eastl::invoke_result_t<eastl::decay_t<F>, Args...>>())
965 {
return !eastl::invoke(
eastl::move(mDecayF), eastl::forward<Args>(args)...); }
967 template <
class... Args>
968 auto operator()(Args&&... args)
const &&
969 -> decltype(!eastl::declval<eastl::invoke_result_t<eastl::decay_t<F>
const, Args...>>())
970 {
return !eastl::invoke(
eastl::move(mDecayF), eastl::forward<Args>(args)...); }
972 eastl::decay_t<F> mDecayF;
1001 template <
typename T,
bool Enabled>
1004 template <
typename T>
1007 size_t operator()(T p)
const {
return size_t(p); }
1012 template <
typename T>
struct hash;
1014 template <
typename T>
1017 template <
typename T>
struct hash<T*>
1018 {
size_t operator()(T* p)
const {
return size_t(uintptr_t(p)); } };
1021 {
size_t operator()(
bool val)
const {
return static_cast<size_t>(val); } };
1024 {
size_t operator()(
char val)
const {
return static_cast<size_t>(val); } };
1026 template <>
struct hash<signed char>
1027 {
size_t operator()(
signed char val)
const {
return static_cast<size_t>(val); } };
1029 template <>
struct hash<unsigned char>
1030 {
size_t operator()(
unsigned char val)
const {
return static_cast<size_t>(val); } };
1032 #if defined(EA_CHAR8_UNIQUE) && EA_CHAR8_UNIQUE
1033 template <>
struct hash<char8_t>
1034 {
size_t operator()(char8_t val)
const {
return static_cast<size_t>(val); } };
1037 #if defined(EA_CHAR16_NATIVE) && EA_CHAR16_NATIVE
1038 template <>
struct hash<char16_t>
1039 {
size_t operator()(char16_t val)
const {
return static_cast<size_t>(val); } };
1042 #if defined(EA_CHAR32_NATIVE) && EA_CHAR32_NATIVE
1043 template <>
struct hash<char32_t>
1044 {
size_t operator()(char32_t val)
const {
return static_cast<size_t>(val); } };
1048 #if !defined(EA_WCHAR_T_NON_NATIVE)
1050 {
size_t operator()(
wchar_t val)
const {
return static_cast<size_t>(val); } };
1053 template <>
struct hash<signed short>
1054 {
size_t operator()(
signed short val)
const {
return static_cast<size_t>(val); } };
1056 template <>
struct hash<unsigned short>
1057 {
size_t operator()(
unsigned short val)
const {
return static_cast<size_t>(val); } };
1059 template <>
struct hash<signed int>
1060 {
size_t operator()(
signed int val)
const {
return static_cast<size_t>(val); } };
1062 template <>
struct hash<unsigned int>
1063 {
size_t operator()(
unsigned int val)
const {
return static_cast<size_t>(val); } };
1065 template <>
struct hash<signed long>
1066 {
size_t operator()(
signed long val)
const {
return static_cast<size_t>(val); } };
1068 template <>
struct hash<unsigned long>
1069 {
size_t operator()(
unsigned long val)
const {
return static_cast<size_t>(val); } };
1071 template <>
struct hash<signed long long>
1072 {
size_t operator()(
signed long long val)
const {
return static_cast<size_t>(val); } };
1074 template <>
struct hash<unsigned long long>
1075 {
size_t operator()(
unsigned long long val)
const {
return static_cast<size_t>(val); } };
1078 {
size_t operator()(
float val)
const {
return static_cast<size_t>(val); } };
1081 {
size_t operator()(
double val)
const {
return static_cast<size_t>(val); } };
1083 template <>
struct hash<long double>
1084 {
size_t operator()(
long double val)
const {
return static_cast<size_t>(val); } };
1086 #if defined(EA_HAVE_INT128) && EA_HAVE_INT128
1088 {
size_t operator()(
uint128_t val)
const {
return static_cast<size_t>(val); } };
1106 size_t operator()(
const char* p)
const
1108 uint32_t c, result = 2166136261U;
1109 while((c = (uint8_t)*p++) != 0)
1110 result = (result * 16777619) ^ c;
1111 return (
size_t)result;
1115 template <>
struct hash<const char*>
1117 size_t operator()(
const char* p)
const
1119 uint32_t c, result = 2166136261U;
1120 while((c = (uint8_t)*p++) != 0)
1121 result = (result * 16777619) ^ c;
1122 return (
size_t)result;
1127 template <>
struct hash<char8_t*>
1129 size_t operator()(
const char8_t* p)
const
1131 uint32_t c, result = 2166136261U;
1132 while((c = (uint8_t)*p++) != 0)
1133 result = (result * 16777619) ^ c;
1134 return (
size_t)result;
1138 template <>
struct hash<const char8_t*>
1140 size_t operator()(
const char8_t* p)
const
1142 uint32_t c, result = 2166136261U;
1143 while((c = (uint8_t)*p++) != 0)
1144 result = (result * 16777619) ^ c;
1145 return (
size_t)result;
1153 size_t operator()(
const char16_t* p)
const
1155 uint32_t c, result = 2166136261U;
1156 while((c = (uint16_t)*p++) != 0)
1157 result = (result * 16777619) ^ c;
1158 return (
size_t)result;
1162 template <>
struct hash<const char16_t*>
1164 size_t operator()(
const char16_t* p)
const
1166 uint32_t c, result = 2166136261U;
1167 while((c = (uint16_t)*p++) != 0)
1168 result = (result * 16777619) ^ c;
1169 return (
size_t)result;
1175 size_t operator()(
const char32_t* p)
const
1177 uint32_t c, result = 2166136261U;
1178 while((c = (uint32_t)*p++) != 0)
1179 result = (result * 16777619) ^ c;
1180 return (
size_t)result;
1184 template <>
struct hash<const char32_t*>
1186 size_t operator()(
const char32_t* p)
const
1188 uint32_t c, result = 2166136261U;
1189 while((c = (uint32_t)*p++) != 0)
1190 result = (result * 16777619) ^ c;
1191 return (
size_t)result;
1195 #if defined(EA_WCHAR_UNIQUE) && EA_WCHAR_UNIQUE
1196 template<>
struct hash<wchar_t*>
1198 size_t operator()(
const wchar_t* p)
const
1200 uint32_t c, result = 2166136261U;
1201 while ((c = (uint32_t)*p++) != 0)
1202 result = (result * 16777619) ^ c;
1203 return (
size_t)result;
1207 template<>
struct hash<const wchar_t*>
1209 size_t operator()(
const wchar_t* p)
const
1211 uint32_t c, result = 2166136261U;
1212 while ((c = (uint32_t)*p++) != 0)
1213 result = (result * 16777619) ^ c;
1214 return (
size_t)result;
1226 template <
typename String>
1229 typedef String string_type;
1230 typedef typename String::value_type value_type;
1231 typedef typename eastl::add_unsigned<value_type>::type unsigned_value_type;
1233 size_t operator()(
const string_type& s)
const
1235 const unsigned_value_type* p = (
const unsigned_value_type*)s.c_str();
1236 uint32_t c, result = 2166136261U;
1237 while((c = *p++) != 0)
1238 result = (result * 16777619) ^ c;
1239 return (
size_t)result;
1246 #include <EASTL/internal/function.h>
Definition: functional.h:500
Definition: functional.h:452
Definition: functional.h:880
Definition: functional.h:735
Definition: functional.h:856
Definition: functional.h:706
Definition: functional.h:832
Definition: functional.h:677
Definition: functional.h:808
Definition: functional.h:651
Definition: functional.h:599
Definition: functional.h:554
Definition: functional.h:432
EA Standard Template Library.
Definition: algorithm.h:288
OutputIterator move(InputIterator first, InputIterator last, OutputIterator result)
Definition: copy_help.h:170
mem_fun_t< Result, T > mem_fun(Result(T::*MemberFunction)())
Definition: functional.h:768
not_fn_ret< F > not_fn(F &&f)
Definition: functional.h:988
pointer_to_unary_function< Arg, Result > ptr_fun(Result(*pFunction)(Arg))
Definition: functional.h:580
mem_fun_ref_t< Result, T > mem_fun_ref(Result(T::*MemberFunction)())
Definition: functional.h:910
Definition: functional.h:1002
Definition: functional_base.h:192
Definition: functional.h:85
Definition: functional.h:395
Definition: functional.h:139
Definition: functional.h:291
Definition: functional.h:219
Definition: functional.h:1015
Definition: functional.h:418
Definition: functional.h:314
Definition: functional.h:337
Definition: functional.h:371
Definition: functional.h:354
Definition: type_transformations.h:378
Definition: functional.h:49
Definition: functional.h:103
Definition: functional.h:67
Definition: functional.h:121
Definition: functional.h:406
Definition: functional.h:163
Definition: functional.h:945
Definition: functional.h:31
Definition: functional.h:205
Definition: functional.h:264
Definition: functional.h:1228
Definition: functional.h:472
Definition: functional_base.h:184