| Index: compiled/bindings/generator.h |
| =================================================================== |
| --- a/compiled/bindings/generator.h |
| +++ b/compiled/bindings/generator.h |
| @@ -175,41 +175,47 @@ namespace bindings_internal |
| }; |
| struct DifferentiatorInfo |
| { |
| size_t offset; |
| std::vector<std::pair<int, std::string>> mapping; |
| }; |
| + typedef std::vector<PropertyInfo> Properties; |
| + typedef std::vector<MethodInfo> Methods; |
| + |
| struct ClassInfo |
| { |
| TYPEID id; |
| TYPEID baseClass; |
| std::string name; |
| - std::vector<PropertyInfo> properties; |
| - std::vector<MethodInfo> methods; |
| + Properties properties; |
| + Methods methods; |
| DifferentiatorInfo subclass_differentiator; |
| ptrdiff_t ref_counted_offset; |
| + FunctionInfo instanceGetter; |
| }; |
| void register_class(const char* name, TYPEID classID, TYPEID baseClassID, |
| - ptrdiff_t ref_counted_offset); |
| + ptrdiff_t ref_counted_offset, |
| + const FunctionInfo& instanceGetter = FunctionInfo()); |
| void register_property(TYPEID classID, const char* name, |
| const FunctionInfo& getter, const FunctionInfo& setter, |
| const char* jsValue = ""); |
| void register_method(TYPEID classID, const char* name, |
| const FunctionInfo& call); |
| void register_differentiator(TYPEID classID, size_t offset, |
| std::vector<std::pair<int, std::string>>& mapping); |
| - std::string wrapCall(const FunctionInfo& call, bool isFunction = true); |
| + std::string wrapCall(const FunctionInfo& call, bool isFunction = true, |
| + const FunctionInfo& instanceGetter = FunctionInfo()); |
| } |
| template<typename ClassType, |
| typename BaseClass = bindings_internal::NoBaseClass, |
| typename std::enable_if<std::is_base_of<ref_counted, ClassType>::value>::type* = nullptr> |
| class class_ |
| { |
| public: |
| @@ -283,9 +289,50 @@ public: |
| mapping.emplace_back(item.first, item.second); |
| bindings_internal::register_differentiator( |
| bindings_internal::TypeInfo<ClassType>(), offset, mapping); |
| return *this; |
| } |
| }; |
| +template<typename ClassType> |
| +class singleton |
| +{ |
| +public: |
| + singleton(const char* name, ClassType* (*instanceGetter)()) |
| + { |
| + bindings_internal::register_class(name, |
| + bindings_internal::TypeInfo<ClassType>(), |
| + bindings_internal::TypeInfo<bindings_internal::NoBaseClass>(), |
| + 0, |
| + instanceGetter |
| + ); |
| + } |
| + |
| + template<typename FieldType> |
| + const singleton& property(const char* name, |
| + FieldType (ClassType::*getter)() const, |
| + void (ClassType::*setter)(FieldType) = nullptr) const |
| + { |
| + bindings_internal::register_property( |
| + bindings_internal::TypeInfo<ClassType>(), name, getter, setter); |
| + return *this; |
| + } |
| + |
| + template<typename ReturnType, typename... Args> |
| + const singleton& function(const char* name, ReturnType (ClassType::*method)(Args...)) const |
| + { |
| + bindings_internal::register_method( |
| + bindings_internal::TypeInfo<ClassType>(), name, method); |
| + return *this; |
| + } |
| + |
| + template<typename ReturnType, typename... Args> |
| + const singleton& function(const char* name, ReturnType (ClassType::*method)(Args...) const) const |
| + { |
| + bindings_internal::register_method( |
| + bindings_internal::TypeInfo<ClassType>(), name, method); |
| + return *this; |
| + } |
| +}; |
| + |
| void printBindings(); |