aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/embind/embind.js45
-rw-r--r--system/include/emscripten/bind.h59
2 files changed, 104 insertions, 0 deletions
diff --git a/src/embind/embind.js b/src/embind/embind.js
index 98d4b13e..0036013d 100644
--- a/src/embind/embind.js
+++ b/src/embind/embind.js
@@ -430,6 +430,51 @@ function __embind_register_smart_ptr(
});
}
+function __embind_register_vector(
+ vectorType,
+ elementType,
+ name,
+ constructor,
+ destructor,
+ length,
+ getter,
+ setter
+) {
+ name = Pointer_stringify(name);
+ elementType = requireRegisteredType(elementType, 'vector ' + name);
+
+ constructor = FUNCTION_TABLE[constructor];
+ destructor = FUNCTION_TABLE[destructor];
+ length = FUNCTION_TABLE[length];
+ getter = FUNCTION_TABLE[getter];
+ setter = FUNCTION_TABLE[setter];
+
+ registerType(vectorType, name, {
+ name: name,
+ fromWireType: function(ptr) {
+ var arr = [];
+ var n = length(ptr);
+
+ for (var i = 0; i < n; i++) {
+ var v = elementType.fromWireType(getter(ptr, i));
+ arr.push(v);
+ }
+
+ destructor(ptr);
+ return arr;
+ },
+ toWireType: function(destructors, o) {
+ var vec = constructor();
+ for (var val in o) {
+ setter(vec, elementType.toWireType(destructors, o[val]));
+ }
+ destructors.push(destructor);
+ destructors.push(vec);
+ return vec;
+ }
+ });
+}
+
function __embind_register_class(
classType,
pointerType,
diff --git a/system/include/emscripten/bind.h b/system/include/emscripten/bind.h
index 9bfef10b..d9293378 100644
--- a/system/include/emscripten/bind.h
+++ b/system/include/emscripten/bind.h
@@ -3,6 +3,7 @@
#include <stddef.h>
#include <assert.h>
#include <string>
+#include <vector>
#include <type_traits>
#include <emscripten/val.h>
#include <emscripten/wire.h>
@@ -98,6 +99,16 @@ namespace emscripten {
GenericFunction destructor,
GenericFunction getPointee);
+ void _embind_register_vector(
+ TYPEID vectorType,
+ TYPEID elementType,
+ const char* name,
+ GenericFunction constructor,
+ GenericFunction destructor,
+ GenericFunction length,
+ GenericFunction getter,
+ GenericFunction setter);
+
void _embind_register_class(
TYPEID classType,
TYPEID pointerType,
@@ -368,6 +379,33 @@ namespace emscripten {
setter(ptr, FieldBinding::fromWireType(value));
}
};
+
+ template<typename VectorType>
+ struct Vector {
+ typedef typename VectorType::value_type ElementType;
+ typedef internal::BindingType<ElementType> FieldBinding;
+ typedef typename FieldBinding::WireType WireType;
+
+ static int length(
+ VectorType* ptr
+ ) {
+ return (*ptr).size();
+ }
+
+ static WireType getAt(
+ VectorType* ptr,
+ int pos
+ ) {
+ return FieldBinding::toWireType((*ptr).at(pos));
+ }
+
+ static void push_back(
+ VectorType* ptr,
+ WireType val
+ ) {
+ (*ptr).push_back(FieldBinding::fromWireType(val));
+ }
+ };
}
////////////////////////////////////////////////////////////////////////////////
@@ -505,6 +543,27 @@ namespace emscripten {
}
////////////////////////////////////////////////////////////////////////////////
+ // VECTORS
+ ////////////////////////////////////////////////////////////////////////////////
+
+ template<typename VectorType>
+ inline void register_vector(const char* name) {
+ typedef typename VectorType::value_type ElementType;
+
+ internal::registerStandardTypes();
+ internal::_embind_register_vector(
+ internal::TypeID<VectorType>::get(),
+ internal::TypeID<ElementType>::get(),
+ name,
+ reinterpret_cast<internal::GenericFunction>(&internal::raw_constructor<VectorType>),
+ reinterpret_cast<internal::GenericFunction>(&internal::raw_destructor<VectorType>),
+ reinterpret_cast<internal::GenericFunction>(&internal::Vector<VectorType>::length),
+ reinterpret_cast<internal::GenericFunction>(&internal::Vector<VectorType>::getAt),
+ reinterpret_cast<internal::GenericFunction>(&internal::Vector<VectorType>::push_back)
+ );
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
// CLASSES
////////////////////////////////////////////////////////////////////////////////