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
							 |