forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			308 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			308 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  |    #ifndef HX_CLASS_H
 | ||
|  | #define HX_CLASS_H
 | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace hx | ||
|  | { | ||
|  | // --- hxClassOf --------------------------------------------------------------
 | ||
|  | //
 | ||
|  | // Gets the class definition that relates to a specific type.
 | ||
|  | // Most classes have their own class data, but the standard types (non-classes)
 | ||
|  | //  use the template traits to get the class
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T>  | ||
|  | inline hx::Class &ClassOf() { typedef typename T::Obj Obj; return Obj::__SGetClass(); } | ||
|  | 
 | ||
|  | template<>  | ||
|  | inline hx::Class &ClassOf<int>() { return GetIntClass(); } | ||
|  | 
 | ||
|  | template<>  | ||
|  | inline hx::Class &ClassOf<double>() { return GetFloatClass(); } | ||
|  | 
 | ||
|  | template<>  | ||
|  | inline hx::Class &ClassOf<float>() { return GetFloatClass(); } | ||
|  | 
 | ||
|  | template<>  | ||
|  | inline hx::Class &ClassOf<bool>() { return GetBoolClass(); } | ||
|  | 
 | ||
|  | template<>  | ||
|  | inline hx::Class &ClassOf<null>() { return GetVoidClass(); } | ||
|  | 
 | ||
|  | template<>  | ||
|  | inline hx::Class &ClassOf<String>() { return GetStringClass(); } | ||
|  | 
 | ||
|  | template<> | ||
|  | inline hx::Class &ClassOf< ::cpp::Int64>() { return GetInt64Class(); } | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | struct hxBaseType { typedef T type; }; | ||
|  | template<typename T> | ||
|  | struct hxBaseType< hx::ObjectPtr<T> > { typedef T type; }; | ||
|  | 
 | ||
|  | template<typename T> inline int ClassSizeOf() { return sizeof( typename hx::hxBaseType<T>::type ); } | ||
|  | 
 | ||
|  | } // end namespace hx
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // --- Class_obj --------------------------------------------------------------------
 | ||
|  | //
 | ||
|  | // The Class_obj provides the type information required by the Reflect and type APIs.
 | ||
|  | 
 | ||
|  | namespace hx | ||
|  | { | ||
|  | typedef Dynamic (*ConstructEmptyFunc)(); | ||
|  | typedef Dynamic (*ConstructArgsFunc)(DynamicArray inArgs); | ||
|  | typedef Dynamic (*ConstructEnumFunc)(String inName,DynamicArray inArgs); | ||
|  | typedef void (*MarkFunc)(hx::MarkContext *__inCtx); | ||
|  | typedef bool (*CanCastFunc)(hx::Object *inPtr); | ||
|  | #ifdef HXCPP_VISIT_ALLOCS
 | ||
|  | typedef void (*VisitFunc)(hx::VisitContext *__inCtx); | ||
|  | #endif
 | ||
|  | typedef bool (*GetStaticFieldFunc)(const String &inString, Dynamic &outValue, hx::PropertyAccess inCallProp); | ||
|  | typedef bool (*SetStaticFieldFunc)(const String &inString, Dynamic &ioValue, hx::PropertyAccess inCallProp); | ||
|  | } | ||
|  | 
 | ||
|  | inline bool operator!=(hx::ConstructEnumFunc inFunc,const null &inNull) { return inFunc!=0; } | ||
|  | 
 | ||
|  | #ifdef HXCPP_SCRIPTABLE
 | ||
|  | namespace hx | ||
|  | { | ||
|  | enum FieldStorage | ||
|  | { | ||
|  |    fsUnknown = 0, | ||
|  |    fsBool, | ||
|  |    fsInt, | ||
|  |    fsFloat, | ||
|  |    fsString, | ||
|  |    fsByte, | ||
|  |    fsObject, | ||
|  | }; | ||
|  | struct StorageInfo | ||
|  | { | ||
|  |    FieldStorage type; | ||
|  |    int          offset; | ||
|  |    String       name; | ||
|  | }; | ||
|  | struct StaticInfo | ||
|  | { | ||
|  |    FieldStorage type; | ||
|  |    void         *address; | ||
|  |    String       name; | ||
|  | }; | ||
|  | 
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | namespace hx | ||
|  | { | ||
|  | 
 | ||
|  | class HXCPP_EXTERN_CLASS_ATTRIBUTES Class_obj : public hx::Object | ||
|  | { | ||
|  | public: | ||
|  |    HX_IS_INSTANCE_OF enum { _hx_ClassId = hx::clsIdClass }; | ||
|  | 
 | ||
|  | 
 | ||
|  |    inline void *operator new( size_t inSize ) | ||
|  |    { | ||
|  |       return hx::InternalCreateConstBuffer(0,(int)inSize); | ||
|  |    } | ||
|  |    void operator delete( void *) { } | ||
|  | 
 | ||
|  | 
 | ||
|  |    Class_obj() : mSuper(0) { }; | ||
|  |    Class_obj(const String &inClassName, String inStatics[], String inMembers[], | ||
|  |              hx::ConstructEmptyFunc inConstructEmpty, hx::ConstructArgsFunc inConstructArgs, | ||
|  |              hx::Class *inSuperClass, hx::ConstructEnumFunc inConstructEnum, | ||
|  |              hx::CanCastFunc inCanCast, hx::MarkFunc inMarkFunc | ||
|  |              #ifdef HXCPP_VISIT_ALLOCS
 | ||
|  |              , hx::VisitFunc inVisitFunc | ||
|  |              #endif
 | ||
|  |              #ifdef HXCPP_SCRIPTABLE
 | ||
|  |              ,const hx::StorageInfo *inStorageInfo | ||
|  |              ,const hx::StaticInfo *inStaticInfo | ||
|  |              #endif
 | ||
|  |              ); | ||
|  | 
 | ||
|  |    String __ToString() const; | ||
|  | 
 | ||
|  |    void MarkStatics(hx::MarkContext *__inCtx); | ||
|  | 
 | ||
|  |    #ifdef HXCPP_VISIT_ALLOCS
 | ||
|  |    void VisitStatics(hx::VisitContext *__inCtx); | ||
|  |    #endif
 | ||
|  | 
 | ||
|  |    static ::Array< ::String > dupFunctions(String inStatics[]); | ||
|  | 
 | ||
|  |    // the "Class class"
 | ||
|  |    hx::Class              __GetClass() const; | ||
|  |    static hx::Class      & __SGetClass(); | ||
|  | 	static void       __boot(); | ||
|  | 
 | ||
|  |    hx::Val __Field(const String &inString ,hx::PropertyAccess inCallProp); | ||
|  | 
 | ||
|  |    hx::Val __SetField(const String &inString,const hx::Val &inValue ,hx::PropertyAccess inCallProp); | ||
|  | 
 | ||
|  |    bool __HasField(const String &inString); | ||
|  | 
 | ||
|  |    virtual Dynamic ConstructEmpty(); | ||
|  |    virtual Dynamic ConstructArgs(hx::DynamicArray inArgs); | ||
|  |    virtual Dynamic ConstructEnum(String inName,hx::DynamicArray inArgs); | ||
|  |    virtual bool VCanCast(hx::Object *inPtr) { return false; } | ||
|  | 
 | ||
|  |    int __GetType() const { return vtObject; } | ||
|  | 
 | ||
|  |    virtual bool __IsEnum(); | ||
|  | 
 | ||
|  | 	inline bool CanCast(hx::Object *inPtr) { return mCanCast ? mCanCast(inPtr) : VCanCast(inPtr); } | ||
|  |    static bool GetNoStaticField(const String &inString, Dynamic &outValue, hx::PropertyAccess inCallProp); | ||
|  |    static bool SetNoStaticField(const String &inString, Dynamic &ioValue, hx::PropertyAccess inCallProp); | ||
|  | 
 | ||
|  |    void registerScriptable(bool inOverwrite); | ||
|  |    | ||
|  | 	hx::CanCastFunc     mCanCast; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |    virtual Array<String>  GetInstanceFields(); | ||
|  |    virtual Array<String>  GetClassFields(); | ||
|  |    hx::Class              GetSuper(); | ||
|  |    #ifdef HXCPP_SCRIPTABLE
 | ||
|  |    const hx::StorageInfo*  GetMemberStorage(String inName); | ||
|  |    const hx::StaticInfo*  GetStaticStorage(String inName); | ||
|  |    #endif
 | ||
|  | 
 | ||
|  |    static hx::Class       Resolve(String inName); | ||
|  | 
 | ||
|  | 
 | ||
|  |    hx::Class              *mSuper; | ||
|  |    String             mName; | ||
|  |    Dynamic            __meta__; | ||
|  |    String             __rtti__; | ||
|  | 
 | ||
|  | 	hx::ConstructArgsFunc  mConstructArgs; | ||
|  | 	hx::ConstructEmptyFunc mConstructEmpty; | ||
|  | 	hx::ConstructEnumFunc  mConstructEnum; | ||
|  |    hx::GetStaticFieldFunc mGetStaticField; | ||
|  |    hx::SetStaticFieldFunc mSetStaticField; | ||
|  | 
 | ||
|  | 	hx::MarkFunc           mMarkFunc; | ||
|  |    #ifdef HXCPP_VISIT_ALLOCS
 | ||
|  | 	hx::VisitFunc           mVisitFunc; | ||
|  |    #endif
 | ||
|  |    Array<String>      mStatics; | ||
|  |    Array<String>      mMembers; | ||
|  | 
 | ||
|  |    #ifdef HXCPP_SCRIPTABLE
 | ||
|  |    const hx::StorageInfo*    mMemberStorageInfo; | ||
|  |    const hx::StaticInfo*    mStaticStorageInfo; | ||
|  |    #endif
 | ||
|  | }; | ||
|  | 
 | ||
|  | } // end namespace hx
 | ||
|  | 
 | ||
|  | void __hxcpp_boot_std_classes(); | ||
|  | 
 | ||
|  | 
 | ||
|  | // --- All classes should be registered with this function via the "__boot" method
 | ||
|  | #ifdef RegisterClass
 | ||
|  | #undef RegisterClass
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | namespace hx | ||
|  | { | ||
|  | 
 | ||
|  | 
 | ||
|  | HXCPP_EXTERN_CLASS_ATTRIBUTES | ||
|  | hx::Class _hx_RegisterClass(const String &inClassName, CanCastFunc inCanCast, | ||
|  |                     String inStatics[], String inMembers[], | ||
|  |                     ConstructEmptyFunc inConstructEmpty, ConstructArgsFunc inConstructArgs, | ||
|  |                     hx::Class *inSuperClass, ConstructEnumFunc inConst=0, MarkFunc inMarkFunc=0 | ||
|  |                     #ifdef HXCPP_VISIT_ALLOCS
 | ||
|  |                     , VisitFunc inVisitFunc=0 | ||
|  |                     #endif
 | ||
|  |                     #ifdef HXCPP_SCRIPTABLE
 | ||
|  |                     ,const hx::StorageInfo *inStorageInfo=0 | ||
|  |                     ,const hx::StaticInfo *inStaticInfo=0 | ||
|  |                     #endif
 | ||
|  |                     ); | ||
|  | 
 | ||
|  | // For older versions
 | ||
|  | inline hx::Class RegisterClass( | ||
|  |                     const String &inClassName, CanCastFunc inCanCast, | ||
|  |                     String inStatics[], String inMembers[], | ||
|  |                     ConstructEmptyFunc inConstructEmpty, ConstructArgsFunc inConstructArgs, | ||
|  |                     hx::Class *inSuperClass, ConstructEnumFunc inConst=0, MarkFunc inMarkFunc=0 | ||
|  |                     #ifdef HXCPP_VISIT_ALLOCS
 | ||
|  |                     , VisitFunc inVisitFunc=0 | ||
|  |                     #endif
 | ||
|  |                     #ifdef HXCPP_SCRIPTABLE
 | ||
|  |                     ,const hx::StorageInfo *inStorageInfo=0 | ||
|  |                     ,const hx::StaticInfo *inStaticInfo=0 | ||
|  |                     #endif
 | ||
|  |                     ) | ||
|  | { | ||
|  |    return _hx_RegisterClass(inClassName, inCanCast, inStatics, inMembers, | ||
|  |                     inConstructEmpty, inConstructArgs, inSuperClass, inConst, inMarkFunc | ||
|  |                     #ifdef HXCPP_VISIT_ALLOCS
 | ||
|  |                     , inVisitFunc | ||
|  |                     #endif
 | ||
|  |                     #ifdef HXCPP_SCRIPTABLE
 | ||
|  |                     ,inStorageInfo ,inStaticInfo | ||
|  |                     #endif
 | ||
|  |                     ); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | HXCPP_EXTERN_CLASS_ATTRIBUTES | ||
|  | void _hx_RegisterClass(const String &inClassName, hx::Class inClass); | ||
|  | 
 | ||
|  | inline void RegisterClass(const String &inClassName, hx::Class inClass) | ||
|  | { | ||
|  |    _hx_RegisterClass(inClassName, inClass); | ||
|  | } | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | inline bool TCanCast(hx::Object *inPtr) | ||
|  | { | ||
|  | 	return inPtr && ( | ||
|  |                   #if (HXCPP_API_LEVEL >= 332)
 | ||
|  |                      inPtr->_hx_isInstanceOf(T::_hx_ClassId) | ||
|  |                   #elif (HXCPP_API_LEVEL==331)
 | ||
|  |                      dynamic_cast<T *>(inPtr) | ||
|  |                   #else
 | ||
|  |                      dynamic_cast<T *>(inPtr->__GetRealObject()) | ||
|  |                      #if (HXCPP_API_LEVEL < 330)
 | ||
|  |                      || inPtr->__ToInterface(typeid(T)) | ||
|  |                      #endif
 | ||
|  |                   #endif
 | ||
|  |                   ); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | #if (HXCPP_API_LEVEL >= 330)
 | ||
|  | template<int HASH> | ||
|  | inline bool TIsInterface(hx::Object *inPtr) | ||
|  | { | ||
|  | 	return inPtr && inPtr->_hx_getInterface(HASH); | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | 
 | ||
|  | HXCPP_EXTERN_CLASS_ATTRIBUTES void RegisterVTableOffset(int inOffset); | ||
|  | 
 | ||
|  | #define HX_REGISTER_VTABLE_OFFSET( CLASS, INTERFACE ) \
 | ||
|  | { \ | ||
|  |    CLASS *dummy = (CLASS *)0; \ | ||
|  |    INTERFACE *intf = dummy; \ | ||
|  |    hx::RegisterVTableOffset( (int)( (size_t)((char *)intf - (char *)dummy)) ); \ | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif
 |