#ifndef HX_NULL_H #define HX_NULL_H // --- null value --------------------------------------------------------- // // This is used by external operatator and return statments - Most will // use operator overloading to convert to the null pointer // Forward declare ... class String; class null; namespace hx { template class ObjectPtr; } namespace hx { null NullArithmetic(const char *inText); } #define HX_NULL_COMPARE_OP(op,type,value) \ bool operator op (const type &inRHS) const { return value; } #define HX_NULL_COMPARE_OPS(type) \ HX_NULL_COMPARE_OP(<,type,false) \ HX_NULL_COMPARE_OP(<=,type,false) \ HX_NULL_COMPARE_OP(>,type,false) \ HX_NULL_COMPARE_OP(>=,type,false) \ HX_NULL_COMPARE_OP(==,type,false) \ HX_NULL_COMPARE_OP(!=,type,true) #define HX_NULL_COMPARE_MOST_OPS(type) \ HX_NULL_COMPARE_OP(<,type,false) \ HX_NULL_COMPARE_OP(<=,type,false) \ HX_NULL_COMPARE_OP(>,type,false) \ HX_NULL_COMPARE_OP(>=,type,false) #define HX_COMPARE_NULL_OP(op,type,value) \ inline bool operator op (type inLHS, const null &) { return value; } #define HX_COMPARE_NULL_OPS(type) \ HX_COMPARE_NULL_OP(<,type,false) \ HX_COMPARE_NULL_OP(<=,type,false) \ HX_COMPARE_NULL_OP(>,type,false) \ HX_COMPARE_NULL_OP(>=,type,false) \ HX_COMPARE_NULL_OP(==,type,false) \ HX_COMPARE_NULL_OP(!=,type,true) #define HX_COMPARE_NULL_MOST_OPS(type) \ HX_COMPARE_NULL_OP(<,type,false) \ HX_COMPARE_NULL_OP(<=,type,false) \ HX_COMPARE_NULL_OP(>,type,false) \ HX_COMPARE_NULL_OP(>=,type,false) #define HX_NULL_ARITHMETIC_OP(op) \ template inline null operator op (T t) const \ { return hx::NullArithmetic(#op); } \ inline null operator op (const null &) const \ { return hx::NullArithmetic(#op); } #define HX_ARITHMETIC_NULL_OP(op) \ template inline null operator op (const T &, const null &) \ { return hx::NullArithmetic(#op); } class null { struct AnyArg { template inline AnyArg(const T&) { } }; public: inline null(){ } template explicit inline null(const hx::ObjectPtr &){ } template explicit inline null(const String &){ } explicit inline null(double){ } explicit inline null(float){ } explicit inline null(int){ } explicit inline null(bool){ } template T StaticCast() { return null(); } operator bool () { return false; } operator int () { return 0; } operator unsigned int () { return 0; } operator double () { return 0; } operator float () { return 0; } operator char () { return 0; } operator unsigned char () { return 0; } operator signed char () { return 0; } operator short () { return 0; } operator unsigned short () { return 0; } operator cpp::UInt64 () { return 0; } operator cpp::Int64 () { return 0; } template inline operator typename hx::Native () const { return 0; } // Any pointer! //operator char * () { return 0; } //operator wchar_t * () { return 0; } template operator T *() { return 0; } bool operator == (null inRHS) const { return true; } bool operator != (null inRHS) const { return false; } bool operator == (null inRHS) { return true; } bool operator != (null inRHS) { return false; } template inline bool operator == (const hx::ObjectPtr &) const; template inline bool operator != (const hx::ObjectPtr &) const; template inline bool operator == (const Array &) const; template inline bool operator != (const Array &) const; inline bool operator == (const hx::FieldRef &) const; inline bool operator != (const hx::FieldRef &) const; inline bool operator == (const hx::IndexRef &) const; inline bool operator != (const hx::IndexRef &) const; inline bool operator == (const Dynamic &) const; inline bool operator != (const Dynamic &) const; inline bool operator == (const String &) const; inline bool operator != (const String &) const; inline bool operator == (const cpp::Variant &v) const { return v.isNull(); } inline bool operator != (const cpp::Variant &v) const{ return !v.isNull(); } inline null operator - () const { return hx::NullArithmetic("-"); } inline null operator ! () const { return hx::NullArithmetic("!"); } template T operator()(const AnyArg &a0=0, const AnyArg &a1=0, const AnyArg &a2=0, const AnyArg &a4=0, const AnyArg &a5=0, const AnyArg &a6=0, const AnyArg &a7=0, const AnyArg &a8=0, const AnyArg &a9=0 ) { hx::NullReference("Function Call", false); T nullDynamic; return nullDynamic; } HX_NULL_COMPARE_OPS(bool) HX_NULL_COMPARE_OPS(double) HX_NULL_COMPARE_OPS(float) HX_NULL_COMPARE_OPS(int) HX_NULL_COMPARE_OPS(unsigned int) HX_NULL_COMPARE_OPS(short) HX_NULL_COMPARE_OPS(unsigned short) HX_NULL_COMPARE_OPS(signed char) HX_NULL_COMPARE_OPS(unsigned char) HX_NULL_COMPARE_OPS(cpp::Int64) HX_NULL_COMPARE_OPS(cpp::UInt64) HX_NULL_COMPARE_MOST_OPS(String) HX_NULL_COMPARE_MOST_OPS(Dynamic) HX_NULL_COMPARE_MOST_OPS(hx::FieldRef) HX_NULL_COMPARE_MOST_OPS(hx::IndexRef) HX_NULL_COMPARE_OP(<,null,false) HX_NULL_COMPARE_OP(<=,null,true) HX_NULL_COMPARE_OP(>,null,false) HX_NULL_COMPARE_OP(>=,null,true) HX_NULL_ARITHMETIC_OP(+); HX_NULL_ARITHMETIC_OP(*); HX_NULL_ARITHMETIC_OP(-); HX_NULL_ARITHMETIC_OP(/); HX_NULL_ARITHMETIC_OP(%); HX_NULL_ARITHMETIC_OP(&); HX_NULL_ARITHMETIC_OP(|); HX_NULL_ARITHMETIC_OP(^); HX_NULL_ARITHMETIC_OP(>>); HX_NULL_ARITHMETIC_OP(<<); }; namespace hx { template struct Null { inline Null() : isNull(true) { } inline Null(const Null &inOther) : isNull(inOther.isNull), value(inOther.value) { } inline Null(const T& inVal) : isNull(false), value(inVal) { } inline Null(const null &) : isNull(true) { } inline Null(const Dynamic &inVal) { isNull = null() == inVal; if (!isNull) value = inVal; } inline Null(const cpp::Variant &inVal) { isNull = inVal.isNull(); if (!isNull) value = inVal; } inline operator Dynamic(); inline T Default(T inDefault) { return isNull ? inDefault : value; } bool isNull; T value; }; } // end namesapce hx typedef null Void; HX_COMPARE_NULL_OPS(bool) HX_COMPARE_NULL_OPS(double) HX_COMPARE_NULL_OPS(float) HX_COMPARE_NULL_OPS(int) HX_COMPARE_NULL_OPS(unsigned int) HX_COMPARE_NULL_OPS(short) HX_COMPARE_NULL_OPS(unsigned short) HX_COMPARE_NULL_OPS(signed char) HX_COMPARE_NULL_OPS(unsigned char) HX_COMPARE_NULL_OPS(cpp::UInt64) HX_COMPARE_NULL_OPS(cpp::Int64) HX_ARITHMETIC_NULL_OP(+) HX_ARITHMETIC_NULL_OP(*) HX_ARITHMETIC_NULL_OP(-) HX_ARITHMETIC_NULL_OP(/) HX_ARITHMETIC_NULL_OP(%) HX_ARITHMETIC_NULL_OP(&) HX_ARITHMETIC_NULL_OP(|) HX_ARITHMETIC_NULL_OP(^) HX_ARITHMETIC_NULL_OP(>>) HX_ARITHMETIC_NULL_OP(<<) // Other ops in Operator.h inline void *_hx_nullptr() { return 0; } #endif