1#ifndef ENTT_PLATFORM_ANDROID_NDK_R17_HPP
2#define ENTT_PLATFORM_ANDROID_NDK_R17_HPP
6# include <android/ndk-version.h>
7# if __NDK_MAJOR__ == 17
10# include <type_traits>
17template<
typename Func,
typename... Args>
18constexpr auto is_invocable(
int) ->
decltype(std::invoke(std::declval<Func>(), std::declval<Args>()...), std::true_type{});
20template<
typename,
typename...>
21constexpr std::false_type is_invocable(...);
23template<
typename Ret,
typename Func,
typename... Args>
24constexpr auto is_invocable_r(
int)
25-> std::enable_if_t<decltype(std::is_convertible_v<decltype(std::invoke(std::declval<Func>(), std::declval<Args>()...)), Ret>, std::true_type>;
28template<
typename,
typename,
typename...>
29constexpr std::false_type is_invocable_r(...);
33template<
typename Func,
typename... Args>
34struct is_invocable: decltype(internal::is_invocable<Func, Args...>(0)) {};
36template<
typename Func,
typename... Argsv>
37inline constexpr bool is_invocable_v = std::is_invocable<Func, Args...>::value;
39template<
typename Ret,
typename Func,
typename... Args>
40struct is_invocable_r: decltype(internal::is_invocable_r<Ret, Func, Args...>(0)) {};
42template<
typename Ret,
typename Func,
typename... Args>
43inline constexpr bool is_invocable_r_v = std::is_invocable_r<Ret, Func, Args...>::value;
45template<
typename Func,
typename... Args>
47 using type =
decltype(std::invoke(std::declval<Func>(), std::declval<Args>()...));
50template<
typename Func,
typename... Args>
51using invoke_result_t =
typename std::invoke_result<Func, Args...>::type;