/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include #include #include namespace facebook::react { namespace array_detail { template struct BridgingStatic { static jsi::Array toJs( jsi::Runtime &rt, const T &array, const std::shared_ptr &jsInvoker) { return toJs(rt, array, jsInvoker, std::make_index_sequence{}); } private: template static jsi::Array toJs( facebook::jsi::Runtime &rt, const T &array, const std::shared_ptr &jsInvoker, std::index_sequence) { return jsi::Array::createWithElements( rt, bridging::toJs(rt, std::get(array), jsInvoker)...); } }; template struct BridgingDynamic { static jsi::Array toJs( jsi::Runtime &rt, const T &list, const std::shared_ptr &jsInvoker) { jsi::Array result(rt, list.size()); size_t index = 0; for (const auto &item : list) { result.setValueAtIndex(rt, index++, bridging::toJs(rt, item, jsInvoker)); } return result; } }; } // namespace array_detail template struct Bridging> : array_detail::BridgingStatic, N> {}; template struct Bridging> : array_detail::BridgingStatic, 2> {}; template struct Bridging> : array_detail::BridgingStatic, sizeof...(Types)> {}; template struct Bridging> : array_detail::BridgingDynamic> { }; template struct Bridging> : array_detail::BridgingDynamic> {}; template struct Bridging> : array_detail::BridgingDynamic> {}; template struct Bridging> : array_detail::BridgingDynamic> { static std::vector fromJs( facebook::jsi::Runtime &rt, const jsi::Array &array, const std::shared_ptr &jsInvoker) { size_t length = array.length(rt); std::vector vector; vector.reserve(length); for (size_t i = 0; i < length; i++) { vector.push_back( bridging::fromJs(rt, array.getValueAtIndex(rt, i), jsInvoker)); } return vector; } }; template struct Bridging> : array_detail::BridgingDynamic> { static std::set fromJs( facebook::jsi::Runtime &rt, const jsi::Array &array, const std::shared_ptr &jsInvoker) { size_t length = array.length(rt); std::set set; for (size_t i = 0; i < length; i++) { set.insert( bridging::fromJs(rt, array.getValueAtIndex(rt, i), jsInvoker)); } return set; } }; } // namespace facebook::react