MeshLib C++ Docs
Loading...
Searching...
No Matches
MRWasmBindings.h
Go to the documentation of this file.
1#pragma once
2
3#include <emscripten/val.h>
4
5#include <cstddef>
6#include <cstdint>
7#include <functional>
8#include <string>
9#include <type_traits>
10#include <utility>
11
12namespace Wasm
13{
14
15[[noreturn]] void throwJsError( const std::string& msg );
16
17template <typename E>
18auto unwrap( E&& e )
19{
20 if ( !e.has_value() )
21 throwJsError( e.error() );
22 if constexpr ( !std::is_void_v<typename std::remove_reference_t<E>::value_type> )
23 return std::move( *e );
24}
25
26template <typename S> struct TypedArrayName;
27template <> struct TypedArrayName<float> { static constexpr const char* value = "Float32Array"; };
28template <> struct TypedArrayName<uint32_t> { static constexpr const char* value = "Uint32Array"; };
29template <> struct TypedArrayName<uint8_t> { static constexpr const char* value = "Uint8Array"; };
30
31template <typename S>
32emscripten::val makeTypedArray( const S* data, size_t count )
33{
35 emscripten::val out = emscripten::val::global( TypedArrayName<S>::value ).new_( count );
36 if ( count != 0 )
37 out.call<void>( "set", emscripten::val( emscripten::typed_memory_view( count, data ) ) );
38 return out;
39}
40
41template <typename V, typename S, size_t Arity = 1>
42emscripten::val packedToTypedArray( const V& v )
43{
44 using Elem = typename V::value_type;
45 static_assert( std::is_trivially_copyable_v<Elem> && sizeof( Elem ) == Arity * sizeof( S ) );
46 return makeTypedArray<S>( reinterpret_cast<const S*>( v.data() ), v.size() * Arity );
47}
48
49template <typename V, typename S, size_t Arity = 1>
50V packedFromTypedArray( emscripten::val arr )
51{
52 using Elem = typename V::value_type;
53 static_assert( std::is_trivially_copyable_v<Elem> && sizeof( Elem ) == Arity * sizeof( S ) );
54 const size_t len = arr["length"].as<size_t>();
55 V v;
56 v.vec_.resize( len / Arity );
57 if ( len != 0 )
58 {
59 emscripten::val view = emscripten::val( emscripten::typed_memory_view(
60 len, reinterpret_cast<S*>( v.data() ) ) );
61 view.call<void>( "set", arr );
62 }
63 return v;
64}
65
66std::function<bool( float )> jsToCppCallback( emscripten::val cb );
67
68}
Definition MRWasmBindings.h:13
V packedFromTypedArray(emscripten::val arr)
Definition MRWasmBindings.h:50
void throwJsError(const std::string &msg)
emscripten::val packedToTypedArray(const V &v)
Definition MRWasmBindings.h:42
std::function< bool(float)> jsToCppCallback(emscripten::val cb)
emscripten::val makeTypedArray(const S *data, size_t count)
Definition MRWasmBindings.h:32
auto unwrap(E &&e)
Definition MRWasmBindings.h:18
static constexpr const char * value
Definition MRWasmBindings.h:27
static constexpr const char * value
Definition MRWasmBindings.h:28
static constexpr const char * value
Definition MRWasmBindings.h:29
Definition MRWasmBindings.h:26