1 #ifndef ENTT_PLATFORM_ANDROID_NDK_R17_HPP
+
2 #define ENTT_PLATFORM_ANDROID_NDK_R17_HPP
+
+
+
+
12 #include <android/ndk-version.h>
+
13 #if __NDK_MAJOR__ == 17
+
+
+
+
17 #include <type_traits>
+
+
+
+
+
+
+
+
+
+
27 template<
typename Func,
typename... Args>
+
28 constexpr
auto is_invocable(
int) -> decltype(std::invoke(std::declval<Func>(), std::declval<Args>()...), std::true_type{});
+
+
+
31 template<
typename,
typename...>
+
32 constexpr std::false_type is_invocable(...);
+
+
+
35 template<
typename Ret,
typename Func,
typename... Args>
+
36 constexpr
auto is_invocable_r(
int)
+
37 -> std::enable_if_t<decltype(std::is_convertible_v<decltype(std::invoke(std::declval<Func>(), std::declval<Args>()...)), Ret>, std::true_type>;
+
+
+
40 template<
typename,
typename,
typename...>
+
41 constexpr std::false_type is_invocable_r(...);
+
+
+
+
+
+
47 template<
typename Func,
typename... Args>
+
48 struct is_invocable: decltype(internal::is_invocable<Func, Args...>(0)) {};
+
+
+
51 template<
typename Func,
typename... Argsv>
+
52 inline constexpr
bool is_invocable_v = std::is_invocable<Func, Args...>::value;
+
+
+
55 template<
typename Ret,
typename Func,
typename... Args>
+
56 struct is_invocable_r: decltype(internal::is_invocable_r<Ret, Func, Args...>(0)) {};
+
+
+
59 template<
typename Ret,
typename Func,
typename... Args>
+
60 inline constexpr
bool is_invocable_r_v = std::is_invocable_r<Ret, Func, Args...>::value;
+
+
+
63 template<
typename Func,
typename...Args>
+
64 struct invoke_result {
+
65 using type = decltype(std::invoke(std::declval<Func>(), std::declval<Args>()...));
+
+
+
+
69 template<
typename Func,
typename... Args>
+
70 using invoke_result_t =
typename std::invoke_result<Func, Args...>::type;
+
+
+
+
+
+
+
+
+
+
+