aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Austin <chad@imvu.com>2013-02-25 18:58:11 -0800
committerJukka Jylänki <jujjyl@gmail.com>2013-04-12 14:24:10 +0300
commit78548810ba0ec6386fc4c7ab1342fe55321dad40 (patch)
treed2885621969ee416d2b5a558c92a5993411589e3
parent07cd277b4df9308db695d8a96ab570b4205b9622 (diff)
Allow const non-member functions
-rwxr-xr-xsystem/include/emscripten/bind.h43
1 files changed, 34 insertions, 9 deletions
diff --git a/system/include/emscripten/bind.h b/system/include/emscripten/bind.h
index d99dd763..33e1cc43 100755
--- a/system/include/emscripten/bind.h
+++ b/system/include/emscripten/bind.h
@@ -440,7 +440,7 @@ namespace emscripten {
template<typename ClassType, typename ElementType, typename IndexType>
struct ArrayAccess {
- static ElementType get(ClassType& ptr, IndexType index) {
+ static ElementType get(const ClassType& ptr, IndexType index) {
return ptr[index];
}
@@ -448,6 +448,18 @@ namespace emscripten {
ptr[index] = value;
}
};
+
+ template<typename KeyType, typename ValueType>
+ struct MapAccess {
+ static ValueType get(const std::map<KeyType, ValueType>& m, const KeyType& k) {
+ auto i = m.find(k);
+ if (i == m.end()) {
+ return ValueType();
+ } else {
+ return i->second;
+ }
+ }
+ };
}
////////////////////////////////////////////////////////////////////////////////
@@ -735,6 +747,22 @@ namespace emscripten {
return *this;
}
+ template<typename ReturnType, typename... Args, typename... Policies>
+ class_& method(const char* methodName, ReturnType (*function)(const ClassType& ptr, Args...), Policies...) {
+ using namespace internal;
+
+ typename WithPolicies<Policies...>::template ArgTypeList<ReturnType, Args...> args;
+ _embind_register_class_method(
+ TypeID<ClassType>::get(),
+ methodName,
+ args.count,
+ args.types,
+ reinterpret_cast<GenericFunction>(&FunctionInvoker<ClassType, ReturnType, Args...>::invoke),
+ sizeof(function),
+ &function);
+ return *this;
+ }
+
template<typename FieldType>
class_& field(const char* fieldName, FieldType ClassType::*field) {
using namespace internal;
@@ -795,7 +823,7 @@ namespace emscripten {
void (VecType::*push_back)(const T&) = &VecType::push_back;
const T& (VecType::*at)(size_t) const = &VecType::at;
- auto c = class_<std::vector<T>>(name)
+ return class_<std::vector<T>>(name)
.template constructor<>()
.method("push_back", push_back)
.method("at", at)
@@ -803,8 +831,6 @@ namespace emscripten {
.template arrayoperatorget<T, size_t>()
.template arrayoperatorset<T, size_t>()
;
-
- return c;
}
////////////////////////////////////////////////////////////////////////////////
@@ -815,13 +841,12 @@ namespace emscripten {
using namespace std;
typedef map<K,V> MapType;
- auto c = class_<MapType>(name)
+ return class_<MapType>(name)
.method("size", &MapType::size)
- .template arrayoperatorget<V, K>()
+ // make this map_get?
+ .method("array_get", internal::MapAccess<K, V>::get)
.template arrayoperatorset<V, K>()
- ;
-
- return c;
+ ;
}