forked from LeenkxTeam/LNXSDK
Update Files
This commit is contained in:
307
Kha/Backends/Kinc-hxcpp/khacpp/include/hx/Class.h
Normal file
307
Kha/Backends/Kinc-hxcpp/khacpp/include/hx/Class.h
Normal file
@ -0,0 +1,307 @@
|
||||
#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
|
Reference in New Issue
Block a user