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
|