// // Copyright Contributors to the MaterialX Project // SPDX-License-Identifier: Apache-2.0 // /** * Include this in every file that defines Emscripten bindings for functions with * std::unordered_map parameters or return types, to automatically convert them to / from JS objects. * It actually doesn't hurt to include this in every binding file ;) * Note that this only works for types that are known to Emscripten, i.e. primitive (built-in) types * and types that have bindings defined. */ #ifndef JSMATERIALX_MAP_HELPER_H #define JSMATERIALX_MAP_HELPER_H #ifdef __EMSCRIPTEN__ #include #include #include namespace emscripten { namespace internal { template std::unordered_map unorderedMapFromJSObject(const val& m) { val keys = val::global("Object").call("entries", m); size_t length = keys["length"].as(); std::unordered_map rm; for (size_t i = 0; i < length; ++i) { rm.set(m[i][0].as(), m[i][1].as()); } return rm; } template struct TypeID> { static constexpr TYPEID get() { return LightTypeID::get(); } }; template struct TypeID> { static constexpr TYPEID get() { return LightTypeID::get(); } }; template struct TypeID&> { static constexpr TYPEID get() { return LightTypeID::get(); } }; template struct TypeID&> { static constexpr TYPEID get() { return LightTypeID::get(); } }; template struct BindingType> { using ValBinding = BindingType; using WireType = ValBinding::WireType; static WireType toWireType(const std::unordered_map &map) { val obj = val::object(); for (std::pair element : map) { obj.set(element.first, element.second); } return ValBinding::toWireType(obj); } static std::unordered_map fromWireType(WireType value) { return unorderedMapFromJSObject(ValBinding::fromWireType(value)); } }; } // namespace internal } // namespace emscripten #endif // __EMSCRIPTEN__ #endif // JSMATERIALX_MAP_HELPER_H