diff options
author | Chad Austin <chad@imvu.com> | 2013-12-06 16:35:47 -0800 |
---|---|---|
committer | Bruce Mitchener <bruce.mitchener@gmail.com> | 2014-02-04 16:21:54 +0700 |
commit | 9ba56d2c20fb2a5d5572e6030bd9dc1794fefdd2 (patch) | |
tree | c74d388a3e78122bd42d73016624b1168570f492 /system/include | |
parent | 52e04b489962f1167868aa46eb8325df4b2c9fdf (diff) |
Add a sample for adding mixins to embind
Diffstat (limited to 'system/include')
-rw-r--r-- | system/include/emscripten/bind.h | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/system/include/emscripten/bind.h b/system/include/emscripten/bind.h index 13fa2008..4d7547a1 100644 --- a/system/include/emscripten/bind.h +++ b/system/include/emscripten/bind.h @@ -533,6 +533,8 @@ namespace emscripten { template<typename ClassType> class value_array : public internal::noncopyable { public: + typedef ClassType class_type; + value_array(const char* name) { using namespace internal; _embind_register_value_array( @@ -605,6 +607,8 @@ namespace emscripten { template<typename ClassType> class value_object : public internal::noncopyable { public: + typedef ClassType class_type; + value_object(const char* name) { using namespace internal; _embind_register_value_object( @@ -753,6 +757,8 @@ namespace emscripten { template<typename T> class wrapper : public T { public: + typedef T class_type; + explicit wrapper(val&& wrapped) : wrapped(std::forward<val>(wrapped)) {} @@ -808,6 +814,8 @@ namespace emscripten { template<typename BaseClass> struct base { + typedef BaseClass class_type; + template<typename ClassType> static void verify() { static_assert(!std::is_same<ClassType, BaseClass>::value, "Base must not have same type as class"); @@ -854,6 +862,9 @@ namespace emscripten { template<typename ClassType, typename BaseSpecifier = internal::NoBaseClass> class class_ { public: + typedef ClassType class_type; + typedef BaseSpecifier base_specifier; + class_() = delete; explicit class_(const char* name) { @@ -874,7 +885,7 @@ namespace emscripten { } template<typename PointerType> - class_& smart_ptr() { + const class_& smart_ptr() const { using namespace internal; typedef smart_ptr_trait<PointerType> PointerTrait; @@ -895,14 +906,14 @@ namespace emscripten { }; template<typename... ConstructorArgs, typename... Policies> - class_& constructor(Policies... policies) { + const class_& constructor(Policies... policies) const { return constructor( &internal::operator_new<ClassType, ConstructorArgs...>, policies...); } template<typename... Args, typename ReturnType, typename... Policies> - class_& constructor(ReturnType (*factory)(Args...), Policies...) { + const class_& constructor(ReturnType (*factory)(Args...), Policies...) const { using namespace internal; // TODO: allows all raw pointers... policies need a rethink @@ -917,7 +928,7 @@ namespace emscripten { } template<typename SmartPtr, typename... Args, typename... Policies> - class_& smart_ptr_constructor(SmartPtr (*factory)(Args...), Policies...) { + const class_& smart_ptr_constructor(SmartPtr (*factory)(Args...), Policies...) const { using namespace internal; smart_ptr<SmartPtr>(); @@ -933,7 +944,7 @@ namespace emscripten { } template<typename WrapperType, typename PointerType = WrapperType*> - class_& allow_subclass() { + const class_& allow_subclass() const { using namespace internal; auto cls = class_<WrapperType, base<ClassType>>(typeid(WrapperType).name()) @@ -947,7 +958,7 @@ namespace emscripten { } template<typename ReturnType, typename... Args, typename... Policies> - class_& function(const char* methodName, ReturnType (ClassType::*memberFunction)(Args...), Policies...) { + const class_& function(const char* methodName, ReturnType (ClassType::*memberFunction)(Args...), Policies...) const { using namespace internal; typename WithPolicies<Policies...>::template ArgTypeList<ReturnType, AllowedRawPointer<ClassType>, Args...> args; @@ -962,7 +973,7 @@ namespace emscripten { } template<typename ReturnType, typename... Args, typename... Policies> - class_& function(const char* methodName, ReturnType (ClassType::*memberFunction)(Args...) const, Policies...) { + const class_& function(const char* methodName, ReturnType (ClassType::*memberFunction)(Args...) const, Policies...) const { using namespace internal; typename WithPolicies<Policies...>::template ArgTypeList<ReturnType, AllowedRawPointer<const ClassType>, Args...> args; @@ -977,7 +988,7 @@ namespace emscripten { } template<typename ReturnType, typename ThisType, typename... Args, typename... Policies> - class_& function(const char* methodName, ReturnType (*function)(ThisType, Args...), Policies...) { + const class_& function(const char* methodName, ReturnType (*function)(ThisType, Args...), Policies...) const { using namespace internal; typename WithPolicies<Policies...>::template ArgTypeList<ReturnType, ThisType, Args...> args; @@ -992,7 +1003,7 @@ namespace emscripten { } template<typename FieldType, typename = typename std::enable_if<!std::is_function<FieldType>::value>::type> - class_& property(const char* fieldName, const FieldType ClassType::*field) { + const class_& property(const char* fieldName, const FieldType ClassType::*field) const { using namespace internal; _embind_register_class_property( @@ -1008,7 +1019,7 @@ namespace emscripten { } template<typename FieldType, typename = typename std::enable_if<!std::is_function<FieldType>::value>::type> - class_& property(const char* fieldName, FieldType ClassType::*field) { + const class_& property(const char* fieldName, FieldType ClassType::*field) const { using namespace internal; _embind_register_class_property( @@ -1024,7 +1035,7 @@ namespace emscripten { } template<typename Getter> - class_& property(const char* fieldName, Getter getter) { + const class_& property(const char* fieldName, Getter getter) const { using namespace internal; typedef GetterPolicy<Getter> GP; _embind_register_class_property( @@ -1040,7 +1051,7 @@ namespace emscripten { } template<typename Getter, typename Setter> - class_& property(const char* fieldName, Getter getter, Setter setter) { + const class_& property(const char* fieldName, Getter getter, Setter setter) const { using namespace internal; typedef GetterPolicy<Getter> GP; typedef SetterPolicy<Setter> SP; @@ -1057,7 +1068,7 @@ namespace emscripten { } template<typename ReturnType, typename... Args, typename... Policies> - class_& class_function(const char* methodName, ReturnType (*classMethod)(Args...), Policies...) { + const class_& class_function(const char* methodName, ReturnType (*classMethod)(Args...), Policies...) const { using namespace internal; typename WithPolicies<Policies...>::template ArgTypeList<ReturnType, Args...> args; @@ -1164,6 +1175,8 @@ namespace emscripten { template<typename EnumType> class enum_ { public: + typedef EnumType enum_type; + enum_(const char* name) { _embind_register_enum( internal::TypeID<EnumType>::get(), |