Path: blob/main/site/source/docs/api_reference/bind.h.rst
6161 views
.. _bind-h:
===========================
bind.h (under-construction)
===========================
The C++ APIs in `bind.h <https://github.com/emscripten-core/emscripten/blob/main/system/include/emscripten/bind.h>`_ define
Guide documentation for this API can be found in :ref:`Embind`.
.. contents:: Table of Contents
:local:
:depth: 1
How to use this API
===================
Defines
-------
.. cpp:namespace: emscripten
.. cpp:function:: EMSCRIPTEN_BINDINGS(name)
This define is used to bind C++ classes, functions and other constructs to
JavaScript. It is used differently depending on the construct being mapped
— see the :ref:`embind guide <embind>` for examples.
:param name: This is a label to mark a group of related bindings (for example ``EMSCRIPTEN_BINDINGS(physics)``, ``EMSCRIPTEN_BINDINGS(components)``, etc.)
.. cpp:type:: sharing_policy
.. cpp:type:: sharing_policy::NONE
.. cpp:type:: sharing_policy::INTRUSIVE
.. cpp:type:: sharing_policy::BY_EMVAL
.. _bind-h-policies:
Policies
========
Currently only :cpp:type:`allow_raw_pointers` policy is supported.
Eventually we hope to implement `Boost.Python-like raw pointer policies
<https://wiki.python.org/moin/boost.python/CallPolicy>`_ for managing
object ownership.
.. cpp:type:: arg
.. cpp:member:: static int index
.. code-block:: cpp
// Prototype
static constexpr int index
.. cpp:type:: ret_val
.. cpp:member:: static int index
.. code-block:: cpp
// Prototype
static constexpr int index
.. cpp:type:: allow_raw_pointers
This policy is used to allow raw pointers.
.. cpp:type:: Transform::type
.. cpp:type:: allow_raw_pointer
.. code-block: cpp
// Prototype
template<typename Slot>
struct allow_raw_pointer : public allow_raw_pointers
select_overload and select_const
======================================
.. cpp:function:: typename std::add_pointer<Signature>::type select_overload(typename std::add_pointer<Signature>::type fn)
.. code-block:: cpp
// Prototype
template<typename Signature>
typename std::add_pointer<Signature>::type select_overload(typename std::add_pointer<Signature>::type fn)
:param typename std\:\:add_pointer<Signature>::type fn:
.. cpp:function:: typename internal::MemberFunctionType<ClassType, Signature>::type select_overload()
.. code-block:: cpp
// Prototype
template<typename Signature, typename ClassType>
typename internal::MemberFunctionType<ClassType, Signature>::type select_overload(Signature (ClassType::*fn))
:param Signature (ClassType::\*fn):
.. cpp:function:: auto select_const()
.. code-block:: cpp
// Prototype
template<typename ClassType, typename ReturnType, typename... Args>
auto select_const(ReturnType (ClassType::*method)(Args...) const)
:param ReturnType (ClassType::\*method)(Args...) const:
.. cpp:function:: typename internal::CalculateLambdaSignature<LambdaType>::type optional_override(const LambdaType& fp)
.. code-block:: cpp
// Prototype
template<typename LambdaType>
typename internal::CalculateLambdaSignature<LambdaType>::type optional_override(const LambdaType& fp)
:param const LambdaType& fp:
Functions
=========
.. cpp:function:: void function()
.. code-block:: cpp
//prototype
template<typename ReturnType, typename... Args, typename... Policies>
void function(const char* name, ReturnType (*fn)(Args...), Policies...)
Registers a function to export to JavaScript. This is called from within
an :cpp:func:`EMSCRIPTEN_BINDINGS` block.
For example to export the function ``lerp()``
.. code:: cpp
// quick_example.cpp
#include <emscripten/bind.h>
using namespace emscripten;
float lerp(float a, float b, float t) {
return (1 - t) * a + t * b;
}
EMSCRIPTEN_BINDINGS(my_module) {
function("lerp", &lerp);
}
:param const char* name: The name of the function to export (e.g. ``"lerp"``).
:param ReturnType (\*fn)(Args...): Function pointer address for the exported function (e.g. ``&lerp``).
:param Policies...: |policies-argument|
Value tuples
==============
.. cpp:class:: value_array : public internal::noncopyable
.. cpp:type:: class_type
A typedef of ``ClassType``, the typename of the templated type for the class.
.. cpp:function:: value_array(const char* name)
Constructor.
:param const char* name:
.. cpp:function:: ~value_array()
Destructor.
.. cpp:function:: value_array& element(ElementType InstanceType::*field)
:param ElementType InstanceType::\*field: Note that ``ElementType`` and ``InstanceType`` are typenames (templated types).
.. cpp:function:: value_array& element(Getter getter, Setter setter)
:param Getter getter: Note that ``Getter`` is a typename (templated type).
:param Setter setter: Note that ``Setter`` is a typename (templated type).
.. cpp:function:: value_array& element(index<Index>)
:param index<Index>: Note that ``Index`` is an integer template parameter.
Value structs
=============
.. cpp:class:: value_object : public internal::noncopyable
.. cpp:type:: class_type
A typedef of ``ClassType``, the typename of the templated type for the class.
.. cpp:function:: value_object(const char* name)
Constructor.
:param const char* name:
.. cpp:function:: ~value_object()
Destructor.
.. cpp:function:: value_object& field(const char* fieldName, FieldType InstanceType::*field)
:param const char* fieldName:
:param FieldType InstanceType\:\:\*field:
.. cpp:function:: value_object& field(const char* fieldName, Getter getter, Setter setter)
:param const char* fieldName:
:param Getter getter: Note that ``Getter`` is a typename (templated type).
:param Setter setter: Note that ``Setter`` is a typename (templated type).
.. cpp:function:: value_object& field(const char* fieldName, index<Index>)
:param const char* fieldName:
:param index<Index>: Note that ``Index`` is an integer template parameter.
Smart pointers
==============
.. cpp:type:: default_smart_ptr_trait
.. code-block:: cpp
//prototype
template<typename PointerType>
struct default_smart_ptr_trait
.. cpp:function:: static sharing_policy get_sharing_policy()
.. cpp:function:: static void* share(void* v)
:param void* v:
.. cpp:function:: static PointerType* construct_null()
:returns: Note that the ``PointerType`` returned is a typename (templated type).
.. cpp:type:: smart_ptr_trait
.. code-block:: cpp
//prototype
template<typename PointerType>
struct smart_ptr_trait : public default_smart_ptr_trait<PointerType>
.. cpp:type:: PointerType::element_type element_type
.. code-block:: cpp
//prototype
typedef typename PointerType::element_type element_type;
A typedef for the PointerType::element_type, where ``PointerType`` is a typename (templated type).
.. cpp:function:: static element_type* get(const PointerType& ptr)
:param const PointerType& ptr: Note that ``PointerType`` is a typename (templated type)
.. cpp:type:: template<typename PointeeType> smart_ptr_trait<std::shared_ptr<PointeeType>>
.. code-block:: cpp
//prototype
template<typename PointeeType>
struct smart_ptr_trait<std::shared_ptr<PointeeType>>
.. cpp:type:: PointerType
A typedef to std::shared_ptr<PointeeType>, where ``PointeeType`` is a typename (templated type).
.. cpp:type:: element_type
A typedef for the ``PointerType::element_type``.
.. cpp:function:: static element_type* get(const PointerType& ptr)
:param const PointerType& ptr:
.. cpp:function:: static sharing_policy get_sharing_policy()
.. cpp:function:: static std::shared_ptr<PointeeType>* share(PointeeType* p, EM_VAL v)
:param PointeeType* p: Note that ``PointeeType`` is a typename (templated type).
:param EM_VAL v:
.. cpp:function:: static PointerType* construct_null()
Classes
=======
.. cpp:class:: wrapper : public T, public internal::WrapperBase
.. code-block:: cpp
//prototype
template<typename T>
class wrapper : public T, public internal::WrapperBase
.. cpp:type:: class_type
A typedef of ``T``, the typename of the templated type for the class.
.. cpp:function:: wrapper(val&& wrapped, Args&&... args)
.. code-block:: cpp
//prototype
template<typename... Args>
explicit wrapper(val&& wrapped, Args&&... args)
: T(std::forward<Args>(args)...)
, wrapped(std::forward<val>(wrapped))
Constructor.
:param val&& wrapped:
:param Args&&... args: Note that ``Args`` is a typename (templated type).
.. cpp:function:: ~wrapper()
Destructor.
.. cpp:function:: ReturnType call(const char* name, Args&&... args) const
Constructor.
:param const char* name:
:param Args&&... args: Note that ``Args`` is a typename (templated type).
:returns: Note that ``ReturnType`` is a typename (templated type).
.. cpp:function:: EMSCRIPTEN_WRAPPER(T)
:param T:
.. cpp:type:: base
.. cpp:type:: class_type
A typedef of ``BaseClass``, the typename of the templated type for the class.
.. cpp:function:: static void verify()
Note, is templated function which takes typename ``ClassType``.
.. cpp:function:: static internal::TYPEID get()
.. code-block:: cpp
template<typename ClassType>
using Upcaster = BaseClass* (*)(ClassType*);
template<typename ClassType>
using Downcaster = ClassType* (*)(BaseClass*);
.. cpp:function:: static Upcaster<ClassType> getUpcaster()
.. code-block:: cpp
//prototype
template<typename ClassType>
static Upcaster<ClassType> getUpcaster()
.. cpp:function:: static Downcaster<ClassType> getDowncaster()
.. code-block:: cpp
//prototype
template<typename ClassType>
static Downcaster<ClassType> getDowncaster()
.. cpp:function:: static To* convertPointer(From* ptr)
.. code-block:: cpp
//prototype
template<typename From, typename To>
static To* convertPointer(From* ptr)
:param From* ptr:
.. cpp:type:: pure_virtual
.. cpp:type:: Transform
Note that this is a templated struct taking typename parameter ``InputType`` and integer ``Index``.
.. cpp:type:: type
This is a typedef to the parent struct typename parameter ``InputType``.
.. cpp:type:: constructor
Note that this is a template struct taking typename ``... ConstructorArgs``.
.. cpp:class:: class_
Note that this is a templated class with typename parameters ``ClassType`` and ``BaseSpecifier``.
.. cpp:type:: class_type
A typedef of ``ClassType`` (a typename for the class).
.. cpp:type:: base_specifier
A typedef of ``BaseSpecifier`` (a typename for the class).
.. cpp:type:: HELPNEEDEDHERE
::
class_() = delete;
.. cpp:function:: explicit class_(const char* name)
.. code-block:: cpp
//prototype
EMSCRIPTEN_ALWAYS_INLINE explicit class_(const char* name)
Constructor.
:param const char* name:
.. cpp:function:: const class_& smart_ptr(const char* name) const
.. code-block:: cpp
//prototype
template<typename PointerType>
EMSCRIPTEN_ALWAYS_INLINE const class_& smart_ptr(const char* name) const
:param const char* name:
:returns: |class_-function-returns|
.. _embind-class-zero-argument-constructor:
.. cpp:function:: const class_& constructor() const
.. code-block:: cpp
//prototype
template<typename... ConstructorArgs, typename... Policies>
EMSCRIPTEN_ALWAYS_INLINE const class_& constructor(Policies... policies) const
Zero-argument form of the class constructor. This invokes the natural constructor with the arguments specified in the template. See :ref:`embind-external-constructors` for more information.
:param Policies... policies: |policies-argument|
:returns: |class_-function-returns|
.. _embind-class-function-pointer-constructor:
.. cpp:function:: const class_& constructor(Callable callable, Policies...) const
.. code-block:: cpp
//prototype
template<typename Signature = internal::DeduceArgumentsTag, typename Callable, typename... Policies>
EMSCRIPTEN_ALWAYS_INLINE const class_& constructor(Callable callable, Policies...) const
Class constructor for objects that use a factory function to create the object. This method will accept either a function pointer, ``std::function``
object or function object which will return a newly constructed object. When the ``Callable`` is a function object the function signature must be
explicitly specified in the ``Signature`` template parameter in the format ``ReturnType (Args...)``. For ``Callable`` types other than function objects
the method signature will be deduced.
The following are all valid calls to ``constructor``:
.. code-block:: cpp
using namespace std::placeholders;
myClass1.constructor(&my_factory);
myClass2.constructor(std::function<ClassType2(float, float)>(&class2_factory));
myClass3.constructor<ClassType3(const val&)>(std::bind(Class3Functor(), _1));
See :ref:`embind-external-constructors` for more information.
:param Callable callable: Note that ``Callable`` may be either a member function pointer, function pointer, ``std::function`` or function object.
:param Policies... policies: |policies-argument|
:returns: |class_-function-returns|
.. cpp:function:: const class_& smart_ptr_constructor() const
.. code-block:: cpp
//prototype
template<typename SmartPtr, typename... Args, typename... Policies>
EMSCRIPTEN_ALWAYS_INLINE const class_& smart_ptr_constructor(const char* smartPtrName, SmartPtr (*factory)(Args...), Policies...) const
:param const char* smartPtrName:
:param SmartPtr (\*factory)(Args...):
:param Policies... policies: |policies-argument|
:returns: |class_-function-returns|
.. cpp:function:: const class_& allow_subclass() const
.. code-block:: cpp
//prototype
template<typename WrapperType, typename PointerType, typename... ConstructorArgs>
EMSCRIPTEN_ALWAYS_INLINE const class_& allow_subclass(
const char* wrapperClassName,
const char* pointerName,
::emscripten::constructor<ConstructorArgs...> = ::emscripten::constructor<>()
) const
:param const char* wrapperClassName:
:param const char* pointerName:
:param emscripten\:\:constructor<ConstructorArgs...> constructor):
:returns: |class_-function-returns|
.. cpp:function:: const class_& allow_subclass(const char* wrapperClassName, ::emscripten::constructor<ConstructorArgs...> constructor) const
.. code-block:: cpp
//prototype
template<typename WrapperType, typename... ConstructorArgs>
EMSCRIPTEN_ALWAYS_INLINE const class_& allow_subclass(
const char* wrapperClassName,
::emscripten::constructor<ConstructorArgs...> constructor = ::emscripten::constructor<>()
) const
:param const char* wrapperClassName:
:param \:\:emscripten\:\:constructor<ConstructorArgs...> constructor):
:returns: |class_-function-returns|
.. cpp:function:: const class_& function() const
.. code-block:: cpp
//prototype
template<typename Signature = internal::DeduceArgumentsTag, typename Callable, typename... Policies>
EMSCRIPTEN_ALWAYS_INLINE const class_& function(const char* methodName, Callable callable, Policies...) const
This method is for declaring a method belonging to a class.
On the JavaScript side this is a function that gets bound as a property of the prototype. For example ``.function("myClassMember", &MyClass::myClassMember)``
would bind ``myClassMember`` to ``MyClass.prototype.myClassMember`` in the JavaScript. This method will accept either a pointer-to-member-function, function
pointer, ``std::function`` object or function object. When the ``Callable`` is not a pointer-to-member-function it must accept the ``ClassType`` as the first
(``this``) parameter. When the ``Callable`` is a function object the function signature must be explicitly specified in the ``Signature`` template parameter
in the format ``ReturnType (Args...)``. For ``Callable`` types other than function objects the method signature will be deduced.
A method name specified in the human-readable well-known symbol format (e.g., ``@@iterator``)
is bound using the named ``Symbol`` for JavaScript (e.g., ``Symbol.iterator``).
The following are all valid calls to ``function``:
.. code-block:: cpp
using namespace std::placeholders;
myClass.function("myClassMember", &MyClass::myClassMember)
.function("myFreeFunction", &my_free_function)
.function("myStdFunction", std::function<float(ClassType&, float, float)>(&my_function))
.function<val(const MyClass&)>("myFunctor", std::bind(&my_functor_taking_this, _1));
:param const char* methodName:
:param Callable callable: Note that ``Callable`` may be either a member function pointer, function pointer, ``std::function`` or function object.
:param typename... Policies: |policies-argument|
:returns: |class_-function-returns|
.. cpp:function:: const class_& iterable() const
.. code-block:: cpp
// prototype
template<typename ElementType>
EMSCRIPTEN_ALWAYS_INLINE const class_& iterable(const char* sizeMethodName, const char* getMethodName) const
Makes a bound class iterable in JavaScript by installing ``Symbol.iterator``.
This enables use with ``for...of`` loops, ``Array.from()``, and spread syntax.
:tparam ElementType: The type of elements yielded by the iterator.
:param sizeMethodName: Name of the bound method that returns the number of elements.
:param getMethodName: Name of the bound method that retrieves an element by index.
:returns: |class_-function-returns|
.. code-block:: cpp
class_<MyContainer>("MyContainer")
.function("size", &MyContainer::size)
.function("get", &MyContainer::get)
.iterable<int>("size", "get");
.. code-block:: javascript
const container = new Module.MyContainer();
for (const item of container) { /* ... */ }
const arr = Array.from(container);
.. cpp:function:: const class_& property() const
.. code-block:: cpp
//prototype
template<typename FieldType, typename = typename std::enable_if<!std::is_function<FieldType>::value>::type>
EMSCRIPTEN_ALWAYS_INLINE const class_& property(const char* fieldName, const FieldType ClassType::*field) const
:param const char* fieldName:
:param const FieldType ClassType\:\:\*field:
:returns: |class_-function-returns|
.. cpp:function:: const class_& property(const char* fieldName, FieldType ClassType::*field) const
.. code-block:: cpp
//prototype
template<typename FieldType, typename = typename std::enable_if<!std::is_function<FieldType>::value>::type>
EMSCRIPTEN_ALWAYS_INLINE const class_& property(const char* fieldName, FieldType ClassType::*field) const
:param const char* fieldName:
:param FieldType ClassType\:\:\*field:
:returns: |class_-function-returns|
.. cpp:function:: const class_& property(const char* fieldName, Getter getter) const
.. code-block:: cpp
//prototype
template<typename PropertyType = internal::DeduceArgumentsTag, typename Getter>
EMSCRIPTEN_ALWAYS_INLINE const class_& property(const char* fieldName, Getter getter) const;
Declare a read-only property with the specified ``fieldName`` on the class using the specified ``getter`` to retrieve the property
value. ``Getter`` may be either a class method, a function, a ``std::function`` or a function object. When ``Getter``
is not pointer-to-member-function, it must accept an instance of the ``ClassType`` as the ``this`` argument. When
``Getter`` is a function object, the property type must be specified as a template parameter as it cannot be deduced,
e.g.: ``myClass.property<int>("myIntProperty", MyIntGetterFunctor());``
:param const char* fieldName:
:param Getter getter: Note that ``Getter`` is a function template typename.
:returns: |class_-function-returns|
.. cpp:function:: const class_& property(const char* fieldName, Getter getter, Setter setter) const
.. code-block:: cpp
//prototype
template<typename PropertyType = internal::DeduceArgumentsTag, typename Getter, typename Setter>
EMSCRIPTEN_ALWAYS_INLINE const class_& property(const char* fieldName, Getter getter, Setter setter) const
This is a function template taking typenames ``Setter`` and ``Getter``: ``template<typename Getter, typename Setter>``
which declares a read-write property with the specified ``fieldName`` on the class. ``Getter`` and ``Setter`` may be either a
class method, a function, a ``std::function`` or a function object. When ``Getter`` or ``Setter`` is not pointer-to-member-function,
it must accept an instance of the ``ClassType`` as the ``this`` argument. When ``Getter`` or ``Setter`` is a function object, the
property type must be specified as a template parameter as it cannot be deduced, e.g.:
``myClass.property<int>("myIntProperty", MyIntGetterFunctor(), MyIntSetterFunctor());``
:param const char* fieldName:
:param Getter getter: Note that ``Getter`` is a function template typename.
:param Setter setter: Note that ``Setter`` is a function template typename.
:returns: |class_-function-returns|
.. cpp:function:: const class_& class_function() const
.. code-block:: cpp
//prototype
template<typename ReturnType, typename... Args, typename... Policies>
EMSCRIPTEN_ALWAYS_INLINE const class_& class_function(const char* methodName, ReturnType (*classMethod)(Args...), Policies...) const
This method is for declaring a static function belonging to a class.
On the JavaScript side this is a function that gets bound as a property
of the constructor. For example ``.class_function("myStaticFunction",
&MyClass::myStaticFunction)`` binds ``myStaticFunction`` to
``MyClass.myStaticFunction``.
A method name specified in the human-readable well-known symbol format (e.g., ``@@species``)
is bound using the named ``Symbol`` for JavaScript (e.g., ``Symbol.species``).
:param const char* methodName:
:param ReturnType (\*classMethod)(Args...):
:param Policies...: |policies-argument|
:returns: |class_-function-returns|
.. cpp:function:: const class_& class_property(const char* fieldName, FieldType *field) const
.. code-block:: cpp
//prototype
template<typename FieldType>
EMSCRIPTEN_ALWAYS_INLINE const class_& property(const char* fieldName, FieldType *field) const
:param const char* fieldName:
:param FieldType ClassType\:\:\*field:
:returns: |class_-function-returns|
Vectors
=======
.. cpp:function:: class_<std::vector<T>> register_vector(const char* name)
.. code-block:: cpp
//prototype
template<typename T>
class_<std::vector<T>> register_vector(const char* name)
A function to register a ``std::vector<T>``.
:param const char* name:
Maps
====
.. cpp:function:: class_<std::map<K, V>> register_map(const char* name)
.. code-block:: cpp
//prototype
template<typename K, typename V>
class_<std::map<K, V>> register_map(const char* name)
A function to register a ``std::map<K, V>``.
:param const char* name:
Enums
=====
.. cpp:class:: enum_
.. code-block:: cpp
//prototype
template<typename EnumType>
class enum_
Registers an enum to export to JavaScript. This is called from within an
:cpp:func:`EMSCRIPTEN_BINDINGS` block and works with both C++98 enums
and C++11 "enum classes". See :ref:`embind-enums` for more information.
.. cpp:type:: enum_type
A typedef of ``EnumType`` (a typename for the class).
.. cpp:function:: enum_(const char* name, enum_value_type valueType = enum_value_type::object)
Constructor.
:param const char* name: Name of the enum in JavaScript.
:param enum_value_type valueType:
Determines how the enumerated values are represented in JavaScript.
Possible values:
- ``enum_value_type::object`` (default):
Values are JavaScript objects with a ``.value`` field.
- ``enum_value_type::number``:
Values are plain numbers matching their corresponding C++ values.
- ``enum_value_type::string``:
Values are strings containing their name.
.. cpp:function:: enum_& value(const char* name, EnumType value)
Registers an enum value.
:param const char* name: The name of the enumerated value.
:param EnumType value: The enumerated value.
:returns: A reference to the current object. This allows chaining of multiple enum values in the :cpp:func:`EMSCRIPTEN_BINDINGS` block.
Constants
=========
.. cpp:function:: void constant(const char* name, const ConstantType& v)
.. code-block:: cpp
//prototype
template<typename ConstantType>
void constant(const char* name, const ConstantType& v)
Registers a constant to export to JavaScript. This is called from within
an :cpp:func:`EMSCRIPTEN_BINDINGS` block.
.. code:: cpp
EMSCRIPTEN_BINDINGS(my_constant_example) {
constant("SOME_CONSTANT", SOME_CONSTANT);
}
:param const char* name: The name of the constant.
:param const ConstantType& v: The constant type. This can be any type known to *embind*.
.. COMMENT (not rendered): Following values are common to many functions, and currently only updated in one place (here).
.. COMMENT (not rendered): These can be properly replaced if required either wholesale or on an individual basis.
.. |policies-argument| replace:: :ref:`Policy <bind-h-policies>` for managing raw pointer object ownership. Currently must be :cpp:type:`allow_raw_pointers`.
.. |class_-function-returns| replace:: A ``const`` reference to the current object. This allows chaining of the :cpp:class:`class_` functions that define the binding in the :cpp:func:`EMSCRIPTEN_BINDINGS` block.