diff --git a/packages/react-native/ReactCommon/react/bridging/Base.h b/packages/react-native/ReactCommon/react/bridging/Base.h index 214d9ddd853a4e..d9525fd142b364 100644 --- a/packages/react-native/ReactCommon/react/bridging/Base.h +++ b/packages/react-native/ReactCommon/react/bridging/Base.h @@ -33,14 +33,14 @@ namespace detail { template struct function_wrapper; -template -struct function_wrapper { - using type = std::function; +template +struct function_wrapper { + using type = std::function; }; -template -struct function_wrapper { - using type = std::function; +template +struct function_wrapper { + using type = std::function; }; template @@ -61,36 +61,47 @@ struct bridging_wrapper< template using bridging_t = typename detail::bridging_wrapper::type; -template , int> = 0> -auto fromJs(jsi::Runtime& rt, T&& value, const std::shared_ptr&) - -> decltype(static_cast( - std::move(convert(rt, std::forward(value))))) { - return static_cast(std::move(convert(rt, std::forward(value)))); +template + requires is_jsi_v +auto fromJs( + jsi::Runtime& rt, + JSArgT&& value, + const std::shared_ptr& /*unused*/) + -> decltype(static_cast( + std::move(convert(rt, std::forward(value))))) + +{ + return static_cast( + std::move(convert(rt, std::forward(value)))); } -template -auto fromJs(jsi::Runtime& rt, T&& value, const std::shared_ptr&) - -> decltype(Bridging>::fromJs( +template +auto fromJs( + jsi::Runtime& rt, + JSArgT&& value, + const std::shared_ptr& /*unused*/) + -> decltype(Bridging>::fromJs( rt, - convert(rt, std::forward(value)))) { - return Bridging>::fromJs( - rt, convert(rt, std::forward(value))); + convert(rt, std::forward(value)))) { + return Bridging>::fromJs( + rt, convert(rt, std::forward(value))); } -template +template auto fromJs( jsi::Runtime& rt, - T&& value, + JSArgT&& value, const std::shared_ptr& jsInvoker) - -> decltype(Bridging>::fromJs( + -> decltype(Bridging>::fromJs( rt, - convert(rt, std::forward(value)), + convert(rt, std::forward(value)), jsInvoker)) { - return Bridging>::fromJs( - rt, convert(rt, std::forward(value)), jsInvoker); + return Bridging>::fromJs( + rt, convert(rt, std::forward(value)), jsInvoker); } -template , int> = 0> +template + requires is_jsi_v auto toJs( jsi::Runtime& rt, T&& value, @@ -143,33 +154,33 @@ inline constexpr bool supportsFromJs< template inline constexpr bool supportsToJs = false; -template +template inline constexpr bool supportsToJs< - T, - Ret, + JSReturnT, + ReturnT, std::void_t(), - std::declval(), + std::declval(), nullptr))>> = std::is_convertible_v< decltype(toJs( std::declval(), - std::declval(), + std::declval(), nullptr)), - Ret>; + ReturnT>; -template +template inline constexpr bool supportsToJs< - T, + ReturnT, jsi::Value, std::void_t(), - std::declval(), + std::declval(), nullptr))>> = std::is_convertible_v< decltype(toJs( std::declval(), - std::declval(), + std::declval(), nullptr)), jsi::Value>; diff --git a/packages/react-native/ReactCommon/react/bridging/Class.h b/packages/react-native/ReactCommon/react/bridging/Class.h index 0d0fcd49e8b961..00495a2e1401aa 100644 --- a/packages/react-native/ReactCommon/react/bridging/Class.h +++ b/packages/react-native/ReactCommon/react/bridging/Class.h @@ -12,54 +12,57 @@ namespace facebook::react::bridging { template < - typename T, - typename C, - typename R, - typename... Args, - typename... JSArgs> -T callFromJs( + typename JSReturnT, + typename ClassT, + typename ReturnT, + typename... ArgsT, + typename... JSArgsT> +JSReturnT callFromJs( jsi::Runtime& rt, - R (C::*method)(jsi::Runtime&, Args...), + ReturnT (ClassT::*method)(jsi::Runtime&, ArgsT...), const std::shared_ptr& jsInvoker, - C* instance, - JSArgs&&... args) { + ClassT* instance, + JSArgsT&&... args) { static_assert( - sizeof...(Args) == sizeof...(JSArgs), "Incorrect arguments length"); + sizeof...(ArgsT) == sizeof...(JSArgsT), "Incorrect arguments length"); static_assert( - (supportsFromJs && ...), "Incompatible arguments"); + (supportsFromJs && ...), "Incompatible arguments"); - if constexpr (std::is_void_v) { + if constexpr (std::is_void_v) { (instance->*method)( - rt, fromJs(rt, std::forward(args), jsInvoker)...); + rt, fromJs(rt, std::forward(args), jsInvoker)...); - } else if constexpr (std::is_void_v) { + } else if constexpr (std::is_void_v) { static_assert( - std::is_same_v, + std::is_same_v, "Void functions may only return undefined"); (instance->*method)( - rt, fromJs(rt, std::forward(args), jsInvoker)...); + rt, fromJs(rt, std::forward(args), jsInvoker)...); return jsi::Value(); - } else if constexpr (is_jsi_v || supportsToJs) { - static_assert(supportsToJs, "Incompatible return type"); + } else if constexpr ( + is_jsi_v || supportsToJs) { + static_assert(supportsToJs, "Incompatible return type"); return toJs( rt, (instance->*method)( - rt, fromJs(rt, std::forward(args), jsInvoker)...), + rt, fromJs(rt, std::forward(args), jsInvoker)...), jsInvoker); - } else if constexpr (is_optional_jsi_v) { + } else if constexpr (is_optional_jsi_v) { static_assert( - is_optional_v - ? supportsToJs - : supportsToJs, + is_optional_v + ? supportsToJs< + typename ReturnT::value_type, + typename JSReturnT::value_type> + : supportsToJs, "Incompatible return type"); auto result = toJs( rt, (instance->*method)( - rt, fromJs(rt, std::forward(args), jsInvoker)...), + rt, fromJs(rt, std::forward(args), jsInvoker)...), jsInvoker); if constexpr (std::is_same_v) { @@ -70,20 +73,21 @@ T callFromJs( return convert(rt, std::move(result)); } else { - static_assert(std::is_convertible_v, "Incompatible return type"); + static_assert( + std::is_convertible_v, "Incompatible return type"); return (instance->*method)( - rt, fromJs(rt, std::forward(args), jsInvoker)...); + rt, fromJs(rt, std::forward(args), jsInvoker)...); } } -template -constexpr size_t getParameterCount(R (*)(Args...)) { - return sizeof...(Args); +template +constexpr size_t getParameterCount(ReturnT (*)(ArgsT...)) { + return sizeof...(ArgsT); } -template -constexpr size_t getParameterCount(R (C::*)(Args...)) { - return sizeof...(Args); +template +constexpr size_t getParameterCount(ReturnT (Class::*)(ArgsT...)) { + return sizeof...(ArgsT); } } // namespace facebook::react::bridging