diff --git a/include/hx/Functions.h b/include/hx/Functions.h index cdf8f5ace..409f6f5fd 100644 --- a/include/hx/Functions.h +++ b/include/hx/Functions.h @@ -1,6 +1,8 @@ #ifndef HX_FUNCTIONS_H #define HX_FUNCTIONS_H +#include + namespace hx { struct HXCPP_EXTERN_CLASS_ATTRIBUTES LocalFunc : public hx::Object @@ -27,11 +29,16 @@ namespace hx template bool IsNotNull(const T1& v1); + struct HXCPP_EXTERN_CLASS_ATTRIBUTES ErasedCallable_obj : public hx::Object + { + virtual std::type_index callableId() const = 0; + }; + template class HXCPP_EXTERN_CLASS_ATTRIBUTES Callable_obj; template - class HXCPP_EXTERN_CLASS_ATTRIBUTES Callable_obj : public hx::Object + class HXCPP_EXTERN_CLASS_ATTRIBUTES Callable_obj : public ErasedCallable_obj { public: HX_IS_INSTANCE_OF enum { _hx_ClassId = ::hx::clsIdClosure }; @@ -49,6 +56,22 @@ namespace hx Dynamic __Run(const Array& inArgs) override = 0; virtual TReturn HX_LOCAL_RUN(TArgs... args) = 0; + + virtual std::type_index callableId() const + { + return std::type_index{ typeid(Callable_obj) }; + } + + virtual int __Compare(const ::hx::Object* other) const override + { + auto otherCallable = dynamic_cast(other); + if (nullptr == otherCallable) + { + return -1; + } + + return callableId() == otherCallable->callableId() ? 0 : -1; + } }; template