forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			236 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			236 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#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<typename O> 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<typename T> 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<typename T> inline null operator op (const T &, const null &) \
							 | 
						||
| 
								 | 
							
								   { return hx::NullArithmetic(#op); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class null
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   struct AnyArg
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      template<typename T>
							 | 
						||
| 
								 | 
							
								      inline AnyArg(const T&) { }
							 | 
						||
| 
								 | 
							
								   };
							 | 
						||
| 
								 | 
							
								   public:
							 | 
						||
| 
								 | 
							
								     inline null(){ } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     template<typename T> explicit inline null(const hx::ObjectPtr<T> &){ } 
							 | 
						||
| 
								 | 
							
								     template<typename T> explicit inline null(const String &){ } 
							 | 
						||
| 
								 | 
							
								     explicit inline null(double){ } 
							 | 
						||
| 
								 | 
							
								     explicit inline null(float){ } 
							 | 
						||
| 
								 | 
							
								     explicit inline null(int){ } 
							 | 
						||
| 
								 | 
							
								     explicit inline null(bool){ } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     template<typename T>
							 | 
						||
| 
								 | 
							
								     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<typename T>
							 | 
						||
| 
								 | 
							
								     inline operator typename hx::Native<T *> () const { return 0; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     // Any pointer!
							 | 
						||
| 
								 | 
							
								     //operator char * () { return 0; }
							 | 
						||
| 
								 | 
							
								     //operator wchar_t * () { return 0; }
							 | 
						||
| 
								 | 
							
								     template<typename T> 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<typename T> inline bool operator == (const hx::ObjectPtr<T> &) const;
							 | 
						||
| 
								 | 
							
								     template<typename T> inline bool operator != (const hx::ObjectPtr<T> &) const;
							 | 
						||
| 
								 | 
							
								     template<typename T> inline bool operator == (const Array<T> &) const;
							 | 
						||
| 
								 | 
							
								     template<typename T> inline bool operator != (const Array<T> &) 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<class T> 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<typename T>
							 | 
						||
| 
								 | 
							
								struct Null
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   inline Null() : isNull(true) { }
							 | 
						||
| 
								 | 
							
								   inline Null(const Null<T> &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
							 | 
						||
| 
								 | 
							
								
							 |