diff options
author | Todd Lee <tlee@imvu.com> | 2012-11-05 14:16:46 -0800 |
---|---|---|
committer | Jukka Jylänki <jujjyl@gmail.com> | 2013-04-12 14:21:41 +0300 |
commit | 3c5dead6741c0a2f3268b04d1ee9a0262f368785 (patch) | |
tree | 3a98a56c92b43fdc8c14f26980ffdad9ddfb0301 | |
parent | 565823a14ad14a5c16f8c40f714963e7cb259e33 (diff) |
Add support for std::vector.
-rw-r--r-- | src/embind/embind.js | 45 | ||||
-rw-r--r-- | system/include/emscripten/bind.h | 59 |
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 //////////////////////////////////////////////////////////////////////////////// |