forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			305 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			305 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | #ifndef HX_FIELD_REF_H
 | ||
|  | #define HX_FIELD_REF_H
 | ||
|  | 
 | ||
|  | namespace hx | ||
|  | { | ||
|  | 
 | ||
|  | // --- FieldRef ----------------------------------------------------------
 | ||
|  | //
 | ||
|  | //  This is used to provide syntaxe for setting fields by name.  This is because
 | ||
|  | //   the field can't be returned by reference, because it may not exist as a dynamic.
 | ||
|  | //
 | ||
|  | //  eg, consider class 'A' with variable 'x':
 | ||
|  | //  class A { int x; }
 | ||
|  | //
 | ||
|  | //  And you have a Dynamic pointing to it:
 | ||
|  | //  Dynamic d = new A;  Then you access x by name:
 | ||
|  | //  d->__Field("x") = 1;
 | ||
|  | //
 | ||
|  | //  __Field can't return a Dynamic & because x is a int, not Dynamic. So I use this class.
 | ||
|  | //  Note that this may change if I fix the generator to create __SetField("x",1) directly.
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #define HX_FIELD_REF_MEM_OP(op,ret) \
 | ||
|  | inline ret operator op (const FieldRef &inA) \ | ||
|  |   { return this->operator Dynamic() op inA.operator Dynamic(); } \ | ||
|  | inline ret operator op (const IndexRef &inA); \ | ||
|  | template<typename T> inline ret operator op (const T& inA) \ | ||
|  |    { return this->operator Dynamic() op inA; } | ||
|  | 
 | ||
|  | #define HX_FIELD_REF_IMPL_MEM_OP(op,ret) \
 | ||
|  | inline ret hx::FieldRef::operator op (const IndexRef &inA) \ | ||
|  |     { return this->operator Dynamic() op inA.operator Dynamic(); } \ | ||
|  | 
 | ||
|  | class FieldRef | ||
|  | { | ||
|  | public: | ||
|  |    explicit FieldRef(hx::Object *inObj,const String &inName) : mObject(inObj), mName(inName) | ||
|  |    { | ||
|  |    } | ||
|  | 
 | ||
|  |    hx::Val operator=(const hx::Val &inRHS) | ||
|  |    { | ||
|  |       return mObject->__SetField(mName,inRHS, HX_PROP_DYNAMIC ); | ||
|  |    } | ||
|  |    #if HXCPP_API_LEVEL >= 330
 | ||
|  |    inline operator hx::Val() const { return mObject ? mObject->__Field(mName, HX_PROP_DYNAMIC) : null(); } | ||
|  |    #endif
 | ||
|  |    inline operator Dynamic() const { return mObject ? Dynamic(mObject->__Field(mName, HX_PROP_DYNAMIC)) : null(); } | ||
|  |    inline operator double() const { return mObject->__Field(mName, HX_PROP_DYNAMIC); } | ||
|  |    inline operator float() const { return mObject->__Field(mName, HX_PROP_DYNAMIC); } | ||
|  |    inline operator int() const { return mObject->__Field(mName, HX_PROP_DYNAMIC); } | ||
|  |    inline operator cpp::UInt64() const { return mObject->__Field(mName, HX_PROP_DYNAMIC); } | ||
|  |    inline operator cpp::Int64() const { return mObject->__Field(mName, HX_PROP_DYNAMIC); } | ||
|  | 
 | ||
|  | 
 | ||
|  |    // post-increment
 | ||
|  |    inline double operator++(int) | ||
|  |    { | ||
|  |       double d = mObject->__Field(mName, HX_PROP_DYNAMIC); | ||
|  |       mObject->__SetField(mName,d+1, HX_PROP_DYNAMIC); | ||
|  |       return d; | ||
|  |    } | ||
|  |    // pre-increment
 | ||
|  |    inline double operator++() | ||
|  |    { | ||
|  |       double d = ((double)mObject->__Field(mName, HX_PROP_DYNAMIC)) + 1; | ||
|  |       mObject->__SetField(mName,d, HX_PROP_DYNAMIC); | ||
|  |       return d; | ||
|  |    } | ||
|  |    // post-decrement
 | ||
|  |    inline double operator--(int) | ||
|  |    { | ||
|  |       double d = mObject->__Field(mName, HX_PROP_DYNAMIC); | ||
|  |       mObject->__SetField(mName,d-1, HX_PROP_DYNAMIC); | ||
|  |       return d; | ||
|  |    } | ||
|  |    // pre-decrement
 | ||
|  |    inline double operator--() | ||
|  |    { | ||
|  |       double d = (double)(mObject->__Field(mName, HX_PROP_DYNAMIC)) - 1; | ||
|  |       mObject->__SetField(mName,d,  HX_PROP_DYNAMIC); | ||
|  |       return d; | ||
|  |    } | ||
|  |    bool operator !() { return ! ((int)(mObject->__Field(mName,  HX_PROP_DYNAMIC))); } | ||
|  |    int operator ~() { return ~ ((int)mObject->__Field(mName,  HX_PROP_DYNAMIC)); } | ||
|  | 
 | ||
|  |    inline bool operator==(const null &) const { return !mObject; } | ||
|  |    inline bool operator!=(const null &) const { return mObject; } | ||
|  | 
 | ||
|  |    double operator -() { return - (double)(mObject->__Field(mName,  HX_PROP_DYNAMIC)); } | ||
|  | 
 | ||
|  | 	bool HasPointer() const { return mObject; } | ||
|  | 
 | ||
|  | 
 | ||
|  |    HX_FIELD_REF_MEM_OP(==,bool) | ||
|  |    HX_FIELD_REF_MEM_OP(!=,bool) | ||
|  |    HX_FIELD_REF_MEM_OP(<,bool) | ||
|  |    HX_FIELD_REF_MEM_OP(<=,bool) | ||
|  |    HX_FIELD_REF_MEM_OP(>,bool) | ||
|  |    HX_FIELD_REF_MEM_OP(>=,bool) | ||
|  | 
 | ||
|  |    HX_FIELD_REF_MEM_OP(+,Dynamic) | ||
|  |    HX_FIELD_REF_MEM_OP(*,double) | ||
|  |    HX_FIELD_REF_MEM_OP(/,double) | ||
|  |    HX_FIELD_REF_MEM_OP(-,double) | ||
|  |    HX_FIELD_REF_MEM_OP(%,double) | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |    String  mName; | ||
|  |    hx::Object *mObject; | ||
|  | }; | ||
|  | 
 | ||
|  | // We can define this one now...
 | ||
|  | template<typename T> | ||
|  | inline FieldRef ObjectPtr<T>::FieldRef(const String &inString) | ||
|  | { | ||
|  |    return hx::FieldRef(mPtr,inString); | ||
|  | } | ||
|  | 
 | ||
|  | #define HX_FIELD_REF_OP(op,ret) \
 | ||
|  | template<typename T> inline ret operator op (T &inT, const FieldRef &inA) \ | ||
|  |    { return inT op ( inA.operator Dynamic()); } | ||
|  | 
 | ||
|  | HX_FIELD_REF_OP(==,bool) | ||
|  | HX_FIELD_REF_OP(!=,bool) | ||
|  | HX_FIELD_REF_OP(<,bool) | ||
|  | HX_FIELD_REF_OP(<=,bool) | ||
|  | HX_FIELD_REF_OP(>,bool) | ||
|  | HX_FIELD_REF_OP(>=,bool) | ||
|  | 
 | ||
|  | HX_FIELD_REF_OP(+,Dynamic) | ||
|  | HX_FIELD_REF_OP(*,double) | ||
|  | HX_FIELD_REF_OP(/,double) | ||
|  | HX_FIELD_REF_OP(-,double) | ||
|  | HX_FIELD_REF_OP(%,double) | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // --- IndexRef --------------------------------------------------------------
 | ||
|  | //
 | ||
|  | // Like FieldRef, but for integer array access
 | ||
|  | //
 | ||
|  | 
 | ||
|  | #define HX_INDEX_REF_MEM_OP(op,ret) \
 | ||
|  | inline ret operator op (const IndexRef &inA) \ | ||
|  |     { return this->operator Dynamic() op inA.operator Dynamic(); } \ | ||
|  | inline ret operator op (const FieldRef &inA) \ | ||
|  |     { return this->operator Dynamic() op inA.operator Dynamic(); } \ | ||
|  | template<typename T> inline ret operator op (const T& inA) \ | ||
|  |    { return this->operator Dynamic() op inA; } | ||
|  | 
 | ||
|  | 
 | ||
|  | class IndexRef | ||
|  | { | ||
|  | public: | ||
|  |    explicit IndexRef(hx::Object *inObj,int inIndex) : mObject(inObj), mIndex(inIndex) | ||
|  |    { | ||
|  |    } | ||
|  | 
 | ||
|  |    Dynamic operator=(const Dynamic &inRHS) | ||
|  |    { | ||
|  |       return mObject->__SetItem(mIndex,inRHS); | ||
|  |    } | ||
|  |    inline operator Dynamic() const { return mObject->__GetItem(mIndex); } | ||
|  |    inline operator double() const { return mObject->__GetItem(mIndex); } | ||
|  |    inline operator int() const { return mObject->__GetItem(mIndex); } | ||
|  | 
 | ||
|  |    // post-increment
 | ||
|  |    inline double operator++(int) | ||
|  |    { | ||
|  |       double d = mObject->__GetItem(mIndex)->__ToDouble(); | ||
|  |       mObject->__SetItem(mIndex,d+1); | ||
|  |       return d; | ||
|  |    } | ||
|  |    // pre-increment
 | ||
|  |    inline double operator++() | ||
|  |    { | ||
|  |       double d = mObject->__GetItem(mIndex)->__ToDouble() + 1; | ||
|  |       mObject->__SetItem(mIndex,d); | ||
|  |       return d; | ||
|  |    } | ||
|  |    // post-decrement
 | ||
|  |    inline double operator--(int) | ||
|  |    { | ||
|  |       double d = mObject->__GetItem(mIndex)->__ToDouble(); | ||
|  |       mObject->__SetItem(mIndex,d-1); | ||
|  |       return d; | ||
|  |    } | ||
|  |    // pre-decrement
 | ||
|  |    inline double operator--() | ||
|  |    { | ||
|  |       double d = mObject->__GetItem(mIndex)->__ToDouble() - 1; | ||
|  |       mObject->__SetItem(mIndex,d); | ||
|  |       return d; | ||
|  |    } | ||
|  |    bool operator !() { return ! mObject->__GetItem(mIndex)->__ToInt(); } | ||
|  |    int operator ~() { return ~ mObject->__GetItem(mIndex)->__ToInt(); } | ||
|  |    double operator -() { return - mObject->__GetItem(mIndex)->__ToDouble(); } | ||
|  | 
 | ||
|  |    inline bool operator==(const null &) const { return !mObject; } | ||
|  |    inline bool operator!=(const null &) const { return mObject; } | ||
|  | 
 | ||
|  |    HX_INDEX_REF_MEM_OP(==,bool) | ||
|  |    HX_INDEX_REF_MEM_OP(!=,bool) | ||
|  |    HX_INDEX_REF_MEM_OP(<,bool) | ||
|  |    HX_INDEX_REF_MEM_OP(<=,bool) | ||
|  |    HX_INDEX_REF_MEM_OP(>,bool) | ||
|  |    HX_INDEX_REF_MEM_OP(>=,bool) | ||
|  | 
 | ||
|  |    HX_INDEX_REF_MEM_OP(+,Dynamic) | ||
|  |    HX_INDEX_REF_MEM_OP(*,double) | ||
|  |    HX_INDEX_REF_MEM_OP(/,double) | ||
|  |    HX_INDEX_REF_MEM_OP(-,double) | ||
|  |    HX_INDEX_REF_MEM_OP(%,double) | ||
|  | 
 | ||
|  | 	bool HasPointer() const { return mObject; } | ||
|  | 
 | ||
|  |    int mIndex; | ||
|  |    hx::Object *mObject; | ||
|  | }; | ||
|  | 
 | ||
|  | // We can define this one now...
 | ||
|  | template<typename T> | ||
|  | inline IndexRef ObjectPtr<T>::IndexRef(int inIndex) | ||
|  | { | ||
|  |    return hx::IndexRef(mPtr,inIndex); | ||
|  | } | ||
|  | 
 | ||
|  | #define HX_INDEX_REF_OP(op,ret) \
 | ||
|  | template<typename T> inline ret operator op (T &inT, const IndexRef &inA) \ | ||
|  |    { return inT op ( inA. operator Dynamic()); } | ||
|  | 
 | ||
|  | HX_INDEX_REF_OP(==,bool) | ||
|  | HX_INDEX_REF_OP(!=,bool) | ||
|  | HX_INDEX_REF_OP(<,bool) | ||
|  | HX_INDEX_REF_OP(<=,bool) | ||
|  | HX_INDEX_REF_OP(>,bool) | ||
|  | HX_INDEX_REF_OP(>=,bool) | ||
|  | 
 | ||
|  | HX_INDEX_REF_OP(+,Dynamic) | ||
|  | HX_INDEX_REF_OP(*,double) | ||
|  | HX_INDEX_REF_OP(/,double) | ||
|  | HX_INDEX_REF_OP(-,double) | ||
|  | HX_INDEX_REF_OP(%,double) | ||
|  | 
 | ||
|  | 
 | ||
|  | // Implement once IndexRef has been defined.
 | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(==,bool) | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(!=,bool) | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(<,bool) | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(<=,bool) | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(>,bool) | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(>=,bool) | ||
|  | 
 | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(+,Dynamic) | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(*,double) | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(/,double) | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(-,double) | ||
|  | HX_FIELD_REF_IMPL_MEM_OP(%,double) | ||
|  | 
 | ||
|  | // Disambiguate Dynamic operators...
 | ||
|  | 
 | ||
|  | #define HX_INDEX_REF_OP_DYNAMIC(op,ret) \
 | ||
|  | inline ret operator op (const Dynamic &inT, const IndexRef &inA) \ | ||
|  |    { return inT op ( inA.operator Dynamic()); } | ||
|  | 
 | ||
|  | HX_INDEX_REF_OP_DYNAMIC(==,bool) | ||
|  | HX_INDEX_REF_OP_DYNAMIC(!=,bool) | ||
|  | HX_INDEX_REF_OP_DYNAMIC(+,Dynamic) | ||
|  | HX_INDEX_REF_OP_DYNAMIC(*,double) | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename _OBJ> | ||
|  | class __TArrayImplRef | ||
|  | { | ||
|  | public: | ||
|  |    _OBJ mObject; | ||
|  |    int mIndex; | ||
|  | 
 | ||
|  |    explicit __TArrayImplRef(_OBJ inObj,int inIndex) : mObject(inObj), mIndex(inIndex) { } | ||
|  | 
 | ||
|  |    template<typename _DATA> | ||
|  |    inline operator _DATA() { return mObject->__get(mIndex); } | ||
|  |    template<typename _DATA> | ||
|  |    inline void operator=(_DATA inRHS) | ||
|  |    { | ||
|  |       mObject->__set(mIndex,inRHS); | ||
|  |    } | ||
|  | }; | ||
|  | 
 | ||
|  | template<typename _OBJ> | ||
|  | __TArrayImplRef<_OBJ> __ArrayImplRef(_OBJ inObj, int inIndex) | ||
|  | { | ||
|  |    return __TArrayImplRef<_OBJ>(inObj,inIndex); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | } // end namespace hx
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif
 |