forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			197 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef HX_ENUM_H
 | |
| #define HX_ENUM_H
 | |
| 
 | |
| 
 | |
| 
 | |
| // Enum (ie enum object class def)  is the same as Class.
 | |
| typedef hx::Class Enum;
 | |
| 
 | |
| 
 | |
| namespace hx
 | |
| {
 | |
| 
 | |
| // --- hx::EnumBase_obj ----------------------------------------------------------
 | |
| //
 | |
| // Base class for Enums.
 | |
| // Specializations of this class don't actually add more data, just extra constructors
 | |
| //  and type information.
 | |
| 
 | |
| class HXCPP_EXTERN_CLASS_ATTRIBUTES EnumBase_obj : public hx::Object
 | |
| {
 | |
|    typedef hx::Object super;
 | |
|    typedef EnumBase_obj OBJ_;
 | |
| 
 | |
| 
 | |
|    protected:
 | |
|       #if (HXCPP_API_LEVEL >= 330)
 | |
|          String  _hx_tag;
 | |
|          int     mFixedFields;
 | |
|          #ifdef HXCPP_SCRIPTABLE
 | |
|          struct CppiaClassInfo *classInfo; 
 | |
|          #endif
 | |
|       #else
 | |
|          String       tag;
 | |
|          DynamicArray mArgs;
 | |
|       #endif
 | |
|    public:
 | |
|       HX_IS_INSTANCE_OF enum { _hx_ClassId = hx::clsIdEnum };
 | |
| 
 | |
|       int          index;
 | |
| 
 | |
|    public:
 | |
|       inline void *operator new( size_t inSize, int inExtra=0)
 | |
|       {
 | |
|          return hx::Object::operator new(inSize+inExtra, true, 0);
 | |
|       }
 | |
|       inline void operator delete(void *, int inExtra ) { }
 | |
|       inline void operator delete(void *, size_t inSize ) { }
 | |
|       inline void operator delete(void *, size_t inSize, int inExtra ) { }
 | |
| 
 | |
| 
 | |
|       HX_DO_ENUM_RTTI_INTERNAL;
 | |
|       static hx::ObjectPtr<hx::Class_obj> &__SGetClass();
 | |
| 
 | |
| 
 | |
|       String toString();
 | |
| 
 | |
|       EnumBase_obj() : index(-1) { }
 | |
|       EnumBase_obj(const null &inNull) : index(-1) { }
 | |
|       int __GetType() const { return vtEnum; }
 | |
|       static Dynamic __CreateEmpty();
 | |
|       static Dynamic __Create(DynamicArray inArgs);
 | |
|       static void __boot();
 | |
| 
 | |
|       void __Mark(hx::MarkContext *__inCtx);
 | |
|       #ifdef HXCPP_VISIT_ALLOCS
 | |
|       void __Visit(hx::VisitContext *__inCtx);
 | |
|       #endif
 | |
| 
 | |
|       static hx::ObjectPtr<EnumBase_obj> Resolve(String inName);
 | |
|       inline static bool __GetStatic(const ::String &inName, Dynamic &outValue, hx::PropertyAccess inCallProp) { return false; }
 | |
| 
 | |
|       #if (HXCPP_API_LEVEL >= 330)
 | |
|       inline cpp::Variant *_hx_getFixed() { return (cpp::Variant *)(this + 1); }
 | |
|       inline const cpp::Variant *_hx_getFixed() const { return (cpp::Variant *)(this + 1); }
 | |
|       inline ::Dynamic __Param(int inID) { return _hx_getFixed()[inID]; }
 | |
|       template<typename T>
 | |
|       inline EnumBase_obj *_hx_init(int inIndex,const T &inValue)
 | |
|       {
 | |
|          #ifdef HXCPP_GC_GENERATIONAL
 | |
|          cpp::Variant &v = _hx_getFixed()[inIndex];
 | |
|          v = inValue;
 | |
|          if (v.type<=cpp::Variant::typeString)
 | |
|              HX_OBJ_WB_GET(this, v.valObject);
 | |
|          #else
 | |
|          _hx_getFixed()[inIndex] = inValue;
 | |
|          #endif
 | |
|          return this;
 | |
|       }
 | |
|       inline void _hx_setIdentity(const String &inTag, int inIndex,int inFixedFields)
 | |
|       {
 | |
|          _hx_tag = inTag;
 | |
|          HX_OBJ_WB_GET(this, _hx_tag.__s);
 | |
|          index = inIndex;
 | |
|          mFixedFields = inFixedFields;
 | |
|       }
 | |
|       DynamicArray _hx_getParameters();
 | |
| 
 | |
|       inline ::Dynamic _hx_getObject(int inId) { return _hx_getFixed()[inId].asDynamic(); }
 | |
|       inline int _hx_getInt(int inId) { return _hx_getFixed()[inId]; }
 | |
|       inline ::cpp::Int64 _hx_getInt64(int inId) { return _hx_getFixed()[inId].asInt64(); }
 | |
|       inline Float _hx_getFloat(int inId) { return _hx_getFixed()[inId]; }
 | |
|       inline bool _hx_getBool(int inId) { return _hx_getFixed()[inId]; }
 | |
|       inline ::String _hx_getString(int inId) { return _hx_getFixed()[inId].asString(); }
 | |
|       inline ::Dynamic _hx_getParamI(int inId) { return _hx_getFixed()[inId]; }
 | |
|       inline int _hx_getParamCount() { return mFixedFields; }
 | |
|       // Alias for _hx_getParamI
 | |
|       Dynamic __GetItem(int inIndex) const;
 | |
| 
 | |
|       // For legacy
 | |
|       inline String __Tag() const { return _hx_tag; }
 | |
| 
 | |
| 
 | |
|       String _hx_getTag() const { return _hx_tag; }
 | |
|       int _hx_getIndex() const { return index; }
 | |
|       #else
 | |
|       Dynamic __Param(int inID) { return mArgs[inID]; }
 | |
|       DynamicArray __EnumParams() { return mArgs; }
 | |
|       String __Tag() const { return tag; }
 | |
|       int __Index() const { return index; }
 | |
| 
 | |
|       void __Set( const String &inName,int inIndex,DynamicArray inArgs)
 | |
|       {
 | |
|          tag = inName;
 | |
|          index = inIndex;
 | |
|          mArgs = inArgs;
 | |
|       }
 | |
|       #endif
 | |
| 
 | |
| 
 | |
|       int __Compare(const hx::Object *inRHS) const;
 | |
| 
 | |
|       virtual String GetEnumName( ) const { return HX_CSTRING("Enum"); }
 | |
| };
 | |
| 
 | |
| 
 | |
| typedef hx::ObjectPtr<EnumBase_obj> EnumBase;
 | |
| 
 | |
| 
 | |
| HXCPP_EXTERN_CLASS_ATTRIBUTES bool __hxcpp_enum_eq( ::hx::EnumBase a,  ::hx::EnumBase b);
 | |
| 
 | |
| // --- CreateEnum -------------------------------------------------------------
 | |
| //
 | |
| // Template function to return a strongly-typed version fo the Enum.
 | |
| // Most of the common stuff is in "Set".
 | |
| 
 | |
| #if (HXCPP_API_LEVEL >= 330)
 | |
| template<typename ENUM>
 | |
| ENUM *CreateEnum(const String &inName,int inIndex, int inFields)
 | |
| {
 | |
|    ENUM *result = new (inFields*sizeof(cpp::Variant)) ENUM;
 | |
|    result->_hx_setIdentity(inName,inIndex,inFields);
 | |
|    return result;
 | |
| }
 | |
| 
 | |
| template<typename ENUM>
 | |
| ENUM *CreateConstEnum(const String &inName,int inIndex)
 | |
| {
 | |
|    ENUM vtable;
 | |
|    ENUM *result = (ENUM *)hx::InternalCreateConstBuffer(&vtable,sizeof(ENUM));
 | |
|    result->_hx_setIdentity(inName,inIndex,0);
 | |
|    return result;
 | |
| }
 | |
| 
 | |
| 
 | |
| #else
 | |
| template<typename ENUM>
 | |
| hx::ObjectPtr<ENUM> CreateEnum(const String &inName,int inIndex, DynamicArray inArgs=DynamicArray())
 | |
| {
 | |
|    ENUM *result = new ENUM;
 | |
|    result->__Set(inName,inIndex,inArgs);
 | |
|    return result;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| } // end namespace hx
 | |
| 
 | |
| #if (HXCPP_API_LEVEL >= 330)
 | |
| inline int _hx_getEnumValueIndex(hx::EnumBase inEnum)
 | |
| {
 | |
|    return inEnum->_hx_getIndex();
 | |
| }
 | |
| #endif
 | |
| 
 | |
| inline void __hxcpp_enum_force(hx::EnumBase inEnum,String inForceName, int inIndex)
 | |
| {
 | |
|    #if (HXCPP_API_LEVEL >= 330)
 | |
|    inEnum->_hx_setIdentity(inForceName, inIndex,0);
 | |
|    #else
 | |
|    hx::DynamicArray empty;
 | |
|    inEnum->__Set(inForceName, inIndex, empty);
 | |
|    #endif
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| #endif
 |