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
 |