563 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			563 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | #ifndef CPP_POINTER_H
 | ||
|  | #define CPP_POINTER_H
 | ||
|  | 
 | ||
|  | namespace cpp | ||
|  | { | ||
|  | 
 | ||
|  | struct AutoCast | ||
|  | { | ||
|  |    void *value; | ||
|  | 
 | ||
|  |    explicit inline AutoCast(void *inValue) : value(inValue) { } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | struct RawAutoCast | ||
|  | { | ||
|  |    void *value; | ||
|  | 
 | ||
|  |    explicit inline RawAutoCast(void *inValue) : value(inValue) { } | ||
|  | 
 | ||
|  |    template<typename T> | ||
|  |    operator T*() const { return (T*)value; } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | Dynamic CreateDynamicPointer(void *inValue); | ||
|  | 
 | ||
|  | enum DynamicHandlerOp | ||
|  | { | ||
|  |    dhoGetClassName, | ||
|  |    dhoToString, | ||
|  |    dhoFromDynamic, | ||
|  |    dhoToDynamic, | ||
|  |    dhoIs, | ||
|  | }; | ||
|  | typedef void (*DynamicHandlerFunc)(DynamicHandlerOp op, void *ioValue, int inSize, void *outResult); | ||
|  | Dynamic CreateDynamicStruct(const void *inValue, int inSize, DynamicHandlerFunc inFunc); | ||
|  | 
 | ||
|  | template<typename T> class Reference; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | struct StructHandlerDynamicParams | ||
|  | { | ||
|  |    StructHandlerDynamicParams(hx::Object *data,const char *inName) : | ||
|  |        outProcessed(false), inName(inName), inData(data) { } | ||
|  |    bool outProcessed; | ||
|  |    hx::Object *inData; | ||
|  |    const char *inName; | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | class DefaultStructHandler | ||
|  | { | ||
|  |    public: | ||
|  |       static inline const char *getName() { return "unknown"; } | ||
|  |       static inline String toString( const void *inValue ) { return HX_CSTRING("Struct"); } | ||
|  |       static inline void handler(DynamicHandlerOp op, void *ioValue, int inSize, void *outResult) | ||
|  |       { | ||
|  |          if (op==dhoToString) | ||
|  |             *(String *)outResult = toString(ioValue); | ||
|  |          else if (op==dhoGetClassName) | ||
|  |             *(const char **)outResult = getName(); | ||
|  |          else if (op==dhoToDynamic) | ||
|  |          { | ||
|  |             // Handle outsize..
 | ||
|  |             *(hx::Object **)outResult = 0; | ||
|  |          } | ||
|  |          else if (op==dhoFromDynamic) | ||
|  |          { | ||
|  |             StructHandlerDynamicParams *params = (StructHandlerDynamicParams *)outResult; | ||
|  |             hx::Object *ptr= params->inData; | ||
|  |             void *data = (void *)ptr->__GetHandle(); | ||
|  |             int len = ptr->__length(); | ||
|  |             if (data && len>=inSize && ptr->__CStr()==params->inName) | ||
|  |             { | ||
|  |                memcpy(ioValue,data,inSize); | ||
|  |                params->outProcessed = true; | ||
|  |             } | ||
|  |          } | ||
|  |          else if (op==dhoIs) | ||
|  |          { | ||
|  |             StructHandlerDynamicParams *params = (StructHandlerDynamicParams *)outResult; | ||
|  |             hx::Object *ptr= params->inData; | ||
|  |             void *data = (void *)ptr->__GetHandle(); | ||
|  |             int len = ptr->__length(); | ||
|  |             params->outProcessed = data && len>=inSize && ptr->__CStr()==params->inName; | ||
|  |          } | ||
|  |       } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | class EnumHandler | ||
|  | { | ||
|  |    public: | ||
|  |       static inline const char *getName() { return "enum"; } | ||
|  |       static inline String toString( const void *inValue ) { | ||
|  |          int val = inValue ? *(int *)inValue : 0; | ||
|  |          return HX_CSTRING("enum(") + String(val) + HX_CSTRING(")"); | ||
|  |       } | ||
|  | 
 | ||
|  |       static inline void handler(DynamicHandlerOp op, void *ioValue, int inSize, void *outResult) | ||
|  |       { | ||
|  |          if (op==dhoToString) | ||
|  |             *(String *)outResult = toString(ioValue); | ||
|  |          else if (op==dhoGetClassName) | ||
|  |             *(const char **)outResult = getName(); | ||
|  |          else if (op==dhoFromDynamic) | ||
|  |          { | ||
|  |             StructHandlerDynamicParams *params = (StructHandlerDynamicParams *)outResult; | ||
|  |             if (params->inData->__GetType()==vtInt) | ||
|  |             { | ||
|  |                *(int *)ioValue =  params->inData->__ToInt(); | ||
|  |                params->outProcessed = true; | ||
|  |             } | ||
|  |             else | ||
|  |                DefaultStructHandler::handler(op,ioValue, inSize, outResult); | ||
|  |          } | ||
|  |          else | ||
|  |             DefaultStructHandler::handler(op,ioValue, inSize, outResult); | ||
|  |       } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T, typename HANDLER = DefaultStructHandler > | ||
|  | class Struct | ||
|  | { | ||
|  | public: | ||
|  |    T value; | ||
|  |    // This allows 'StaticCast' to be used from arrays
 | ||
|  |    typedef Dynamic Ptr; | ||
|  | 
 | ||
|  |    inline Struct( ) {  } | ||
|  |    inline Struct( const T &inRHS ) : value(inRHS) {  } | ||
|  |    inline Struct( const null &) { value = T(); } | ||
|  |    inline Struct( const Reference<T> &); | ||
|  |    inline Struct( const Dynamic &inRHS) { fromDynamic(inRHS.mPtr); } | ||
|  | 
 | ||
|  |    inline Struct<T,HANDLER> &operator=( const T &inRHS ) { value = inRHS; return *this; } | ||
|  |    inline Struct<T,HANDLER> &operator=( const null & ) { value = T(); return *this; } | ||
|  |    inline Struct<T,HANDLER> &operator=( const Dynamic &inRHS ) { return *this = Struct<T,HANDLER>(inRHS); } | ||
|  | 
 | ||
|  |    operator Dynamic() const | ||
|  |    { | ||
|  |       hx::Object *result = 0; | ||
|  |       HANDLER::handler(dhoToDynamic, (void *)&value, sizeof(T), &result ); | ||
|  |       if (result) | ||
|  |          return result; | ||
|  |       return CreateDynamicStruct( &value, sizeof(T), HANDLER::handler); | ||
|  |    } | ||
|  |    operator String() const { return HANDLER::toString(&value); } | ||
|  | 
 | ||
|  |    #if (HXCPP_API_LEVEL >= 330)
 | ||
|  |    inline Struct( const hx::Val &inRHS) { fromDynamic(inRHS.asObject()); } | ||
|  |    operator hx::Val() const { return operator Dynamic(); } | ||
|  |    #endif
 | ||
|  | 
 | ||
|  |    bool operator==(const Struct<T,HANDLER> &inRHS) const { return value==inRHS.value; } | ||
|  |    bool operator==(const null &inRHS) const { return false; } | ||
|  |    bool operator!=(const null &inRHS) const { return true; } | ||
|  | 
 | ||
|  |    // Haxe uses -> notation
 | ||
|  |    inline T *operator->() { return &value; } | ||
|  | 
 | ||
|  |    T &get() { return value; } | ||
|  | 
 | ||
|  |    static inline bool is( const Dynamic &inRHS) | ||
|  |    { | ||
|  |       hx::Object *ptr = inRHS.mPtr; | ||
|  |       if (!ptr) | ||
|  |          return false; | ||
|  |       StructHandlerDynamicParams convert(ptr, ptr->__CStr()); | ||
|  |       HANDLER::handler(dhoIs, 0, sizeof(T), &convert ); | ||
|  |       return convert.outProcessed; | ||
|  |    } | ||
|  | 
 | ||
|  | 
 | ||
|  |    inline void fromDynamic( hx::Object *ptr) | ||
|  |    { | ||
|  |       if (!ptr) | ||
|  |       { | ||
|  |          value = T(); | ||
|  |          return; | ||
|  |       } | ||
|  |       StructHandlerDynamicParams convert(ptr, ptr->__CStr()); | ||
|  |       HANDLER::handler(dhoFromDynamic, &value, sizeof(T), &convert ); | ||
|  |       if (!convert.outProcessed) | ||
|  |       { | ||
|  |          hx::NullReference("DynamicData", true); | ||
|  |          return; | ||
|  |       } | ||
|  |    } | ||
|  | 
 | ||
|  |    inline operator T& () { return value; } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | class Pointer | ||
|  | { | ||
|  | public: | ||
|  |    typedef T elementType; | ||
|  | 
 | ||
|  |    T *ptr; | ||
|  | 
 | ||
|  |    inline Pointer( ) : ptr(0) { } | ||
|  |    inline Pointer( const Pointer &inRHS ) : ptr(inRHS.ptr) {  } | ||
|  |    inline Pointer( const Dynamic &inRHS) { ptr = inRHS==null()?0: (T*)inRHS->__GetHandle(); } | ||
|  |    inline Pointer( const null &inRHS ) : ptr(0) { } | ||
|  |    inline Pointer( const cpp::Variant &inVariant ) { | ||
|  |       hx::Object *obj = inVariant.asObject(); | ||
|  |       ptr = obj  ? (T*)inVariant.valObject->__GetHandle() : 0; | ||
|  |    } | ||
|  | 
 | ||
|  |    template<typename O> | ||
|  |    inline Pointer( const O *inValue ) : ptr( (T*) inValue) { } | ||
|  |    //inline Pointer( T *inValue ) : ptr(inValue) { }
 | ||
|  |    inline Pointer( AutoCast inValue ) : ptr( (T*)inValue.value) { } | ||
|  | 
 | ||
|  |    template<typename H> | ||
|  |    inline Pointer( const Struct<T,H> &structVal ) : ptr( &structVal.value ) { } | ||
|  | 
 | ||
|  |    template<typename O> | ||
|  |    inline void setRaw(const O *inValue ) { ptr =  (T*) inValue; } | ||
|  |     | ||
|  | 
 | ||
|  |    inline Pointer operator=( const Pointer &inRHS ) { return ptr = inRHS.ptr; } | ||
|  |    inline Dynamic operator=( Dynamic &inValue ) | ||
|  |    { | ||
|  |       ptr = inValue==null() ? 0 : (T*) inValue->__GetHandle(); | ||
|  |       return inValue; | ||
|  |    } | ||
|  |    inline Dynamic operator=( null &inValue ) { ptr=0; return inValue; } | ||
|  | 
 | ||
|  |    template<typename O> | ||
|  |    inline Pointer operator=( const Pointer<O> &inValue ) { ptr = (T*) inValue.ptr; return *this; } | ||
|  | 
 | ||
|  |    template<typename O> | ||
|  |    inline Pointer operator=( const O *inValue ) { ptr = (T*) inValue; return *this; } | ||
|  | 
 | ||
|  |    template<typename H> | ||
|  |    inline Pointer operator=( const Struct<T,H> &structVal ) { ptr = &structVal.value; return *this; } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |    inline AutoCast reinterpret() { return AutoCast(ptr); } | ||
|  |    inline RawAutoCast rawCast() { return RawAutoCast(ptr); } | ||
|  | 
 | ||
|  |    inline bool operator==( const null &inValue ) const { return ptr==0; } | ||
|  |    inline bool operator!=( const null &inValue ) const { return ptr!=0; } | ||
|  | 
 | ||
|  |    // Allow '->' syntax
 | ||
|  |    inline Pointer *operator->() { return this; } | ||
|  |  	inline Pointer inc() { return ++ptr; } | ||
|  | 	inline Pointer dec() { return --ptr; } | ||
|  | 	inline Pointer add(int inInt) { return ptr+inInt; } | ||
|  | 	inline Pointer sub(int inInt) { return ptr-inInt; } | ||
|  |  	inline Pointer incBy(int inDiff) { ptr+=inDiff; return ptr; } | ||
|  |  	inline Pointer decBy(int inDiff) { ptr-=inDiff; return ptr; } | ||
|  |  	inline T &postIncRef() { return *ptr++; } | ||
|  |  	inline T &postIncVal() { return *ptr++; } | ||
|  | 
 | ||
|  |    inline T &at(int inIndex) { return ptr[inIndex]; } | ||
|  |    inline void setAt(int inIndex, const T &test) { ptr[inIndex] = test; } | ||
|  | 
 | ||
|  |    inline T &__get(int inIndex) { return ptr[inIndex]; } | ||
|  |    inline T &__set(int inIndex, const T &inValue) { T *p = ptr+inIndex; *p = inValue; return *p; } | ||
|  | 
 | ||
|  |    inline T &get_value() { return *ptr; } | ||
|  |    inline T &get_ref() { return *ptr; } | ||
|  |    inline T &set_ref(const T &inValue) { return *ptr = inValue;  } | ||
|  | 
 | ||
|  |    operator Dynamic () const { return CreateDynamicPointer((void *)ptr); } | ||
|  |    #if (HXCPP_API_LEVEL >= 330)
 | ||
|  |    operator cpp::Variant () const { return CreateDynamicPointer((void *)ptr); } | ||
|  |    #endif
 | ||
|  | 
 | ||
|  |    operator T * () { return ptr; } | ||
|  |    T * get_raw() { return ptr; } | ||
|  |    const T * get_constRaw() { return ptr; } | ||
|  | 
 | ||
|  |    inline void destroy() { delete ptr; } | ||
|  |    inline void destroyArray() { delete [] ptr; } | ||
|  | 
 | ||
|  |    inline bool lt(Pointer inOther) { return ptr < inOther.ptr; } | ||
|  |    inline bool gt(Pointer inOther) { return ptr > inOther.ptr; } | ||
|  |    inline bool leq(Pointer inOther) { return ptr <= inOther.ptr; } | ||
|  |    inline bool geq(Pointer inOther) { return ptr >= inOther.ptr; } | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template<> | ||
|  | class Pointer<void> | ||
|  | { | ||
|  | public: | ||
|  |    enum { elementSize = 0 }; | ||
|  | 
 | ||
|  |    void *ptr; | ||
|  | 
 | ||
|  |    inline Pointer( ) : ptr(0) { } | ||
|  |    inline Pointer( const Pointer &inRHS ) : ptr(inRHS.ptr) {  } | ||
|  |    inline Pointer( const Dynamic &inRHS) { ptr = inRHS==null()?0: (void*)inRHS->__GetHandle(); } | ||
|  |    inline Pointer( const null &inRHS ) : ptr(0) { } | ||
|  | 
 | ||
|  |    template<typename O> | ||
|  |    inline Pointer( const O *inValue ) : ptr( (void*) inValue) { } | ||
|  |    //inline Pointer( T *inValue ) : ptr(inValue) { }
 | ||
|  |    inline Pointer( AutoCast inValue ) : ptr( (void*)inValue.value) { } | ||
|  | 
 | ||
|  |    inline Pointer operator=( const Pointer &inRHS ) { return ptr = inRHS.ptr; } | ||
|  |    inline Dynamic operator=( Dynamic &inValue ) | ||
|  |    { | ||
|  |       ptr = inValue==null() ? 0 : (void*) inValue->__GetHandle(); | ||
|  |       return inValue; | ||
|  |    } | ||
|  |    inline Dynamic operator=( null &inValue ) { ptr=0; return inValue; } | ||
|  |    inline AutoCast reinterpret() { return AutoCast(ptr); } | ||
|  |    inline RawAutoCast rawCast() { return RawAutoCast(ptr); } | ||
|  | 
 | ||
|  |    inline bool operator==( const null &inValue ) const { return ptr==0; } | ||
|  |    inline bool operator!=( const null &inValue ) const { return ptr!=0; } | ||
|  | 
 | ||
|  |    // Allow '->' syntax
 | ||
|  |    inline Pointer *operator->() { return this; } | ||
|  |  	inline Pointer inc() { return ptr; } | ||
|  | 	inline Pointer dec() { return ptr; } | ||
|  | 	inline Pointer add(int inInt) { return ptr; } | ||
|  | 	inline Pointer sub(int inInt) { return ptr; } | ||
|  |  	inline Pointer incBy(int inDiff) { return ptr; } | ||
|  |  	inline Pointer decBy(int inDiff) { return ptr; } | ||
|  |  	inline void postIncRef() {  } | ||
|  |  	inline void postIncVal() {  } | ||
|  | 
 | ||
|  |    inline void at(int inIndex) {  } | ||
|  | 
 | ||
|  |    inline void __get(int inIndex) { } | ||
|  | 
 | ||
|  |    template<typename O> | ||
|  |    inline void __set(int inIndex, O inValue) { } | ||
|  | 
 | ||
|  |    inline void get_value() {  } | ||
|  |    inline void get_ref() {  } | ||
|  |    template<typename O> inline void set_ref(O val) {  } | ||
|  | 
 | ||
|  |    operator Dynamic () const { return CreateDynamicPointer(ptr); } | ||
|  |    //operator hx::Val () const { return CreateDynamicPointer((void *)ptr); }
 | ||
|  |    operator void * () { return ptr; } | ||
|  |    void * get_raw() { return ptr; } | ||
|  |    const void * get_constRaw() { return ptr; } | ||
|  | 
 | ||
|  |    inline void destroy() {  } | ||
|  |    inline void destroyArray() {  } | ||
|  | 
 | ||
|  |    inline bool lt(Pointer inOther) { return ptr < inOther.ptr; } | ||
|  |    inline bool gt(Pointer inOther) { return ptr > inOther.ptr; } | ||
|  |    inline bool leq(Pointer inOther) { return ptr <= inOther.ptr; } | ||
|  |    inline bool geq(Pointer inOther) { return ptr >= inOther.ptr; } | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | inline bool operator == (const null &, Pointer<T> inPtr) { return inPtr.ptr==0; } | ||
|  | template<typename T> | ||
|  | inline bool operator != (const null &, Pointer<T> inPtr) { return inPtr.ptr!=0; } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | class Reference : public Pointer<T> | ||
|  | { | ||
|  | public: | ||
|  |    using Pointer<T>::ptr; | ||
|  | 
 | ||
|  | 
 | ||
|  |    inline Reference( const T &inRHS ) : Pointer<T>(&inRHS) {  } | ||
|  |    inline Reference( T &inRHS ) : Pointer<T>(&inRHS) {  } | ||
|  | 
 | ||
|  |    inline Reference( ) : Pointer<T>((T*)0) { } | ||
|  |    inline Reference( const Reference &inRHS ) : Pointer<T>(inRHS.ptr) {  } | ||
|  |    inline Reference( const Dynamic &inRHS) { ptr = inRHS==null()?0: (T*)inRHS->__GetHandle(); } | ||
|  |    inline Reference( const null &inRHS ) : Pointer<T>((T*)0) { } | ||
|  |    inline Reference( const T *inValue ) : Pointer<T>( (T*) inValue) { } | ||
|  |    //inline Reference( T *inValue ) : Pointer(inValue) { }
 | ||
|  |    inline Reference( AutoCast inValue ) : Pointer<T>( (T*)inValue.value) { } | ||
|  | 
 | ||
|  |    template<typename OTHER> | ||
|  |    inline Reference( const Reference<OTHER> &inOther ) | ||
|  |    { | ||
|  |       // Allow reinterpret or not?
 | ||
|  |       ptr = (T*)inOther.ptr; | ||
|  |    } | ||
|  | 
 | ||
|  |    template<typename H> | ||
|  |    inline Reference( const Struct<T,H> &structVal ) : Pointer<T>( &structVal.value ) { } | ||
|  | 
 | ||
|  |    inline Reference operator=( const Reference &inRHS ) { return ptr = inRHS.ptr; } | ||
|  | 
 | ||
|  | 
 | ||
|  |    inline T *operator->() const { return ptr; } | ||
|  |     | ||
|  |    inline operator T &() { return *ptr; } | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | template<typename T,typename H> | ||
|  | Struct<T,H>::Struct( const Reference<T> &ref ) : value(*ref.ptr) { }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | class Function | ||
|  | { | ||
|  | public: | ||
|  |    T *call; | ||
|  | 
 | ||
|  |    inline Function( ) { } | ||
|  |    inline Function( const Function &inRHS ) : call(inRHS.call) {  } | ||
|  |    inline Function( const Dynamic &inRHS) { call = inRHS==null()?0: (T*)inRHS->__GetHandle(); } | ||
|  |    inline Function( const null &inRHS ) { call = 0; } | ||
|  |    inline Function( T *inValue ) : call((T*)(inValue)) { } | ||
|  |    //inline Function( T *inValue ) : call(inValue) { }
 | ||
|  |    inline Function( AutoCast inValue ) : call( (T*)inValue.value) { } | ||
|  |    inline Function( const hx::AnyCast &inValue ) : call( (T*)inValue.mPtr) { } | ||
|  | 
 | ||
|  |    template<typename FROM> | ||
|  |    inline static Function __new(FROM from) | ||
|  |    { | ||
|  |       return Function(from); | ||
|  |    } | ||
|  | 
 | ||
|  |    inline Function operator=( const Function &inRHS ) { return call = inRHS.call; } | ||
|  |    inline Dynamic operator=( Dynamic &inValue ) | ||
|  |    { | ||
|  |       call = inValue==null() ? 0 : (T*) inValue->__GetHandle(); | ||
|  |       return inValue; | ||
|  |    } | ||
|  |    inline Dynamic operator=( null &inValue ) { call=0; return inValue; } | ||
|  |    inline bool operator==( const null &inValue ) const { return call==0; } | ||
|  |    inline bool operator!=( const null &inValue ) const { return call!=0; } | ||
|  | 
 | ||
|  | 
 | ||
|  |    operator Dynamic () const { return CreateDynamicPointer((void *)call); } | ||
|  |    //operator hx::Val () const { return CreateDynamicPointer((void *)call); }
 | ||
|  |    operator T * () { return call; } | ||
|  |    operator void * () { return (void *)call; } | ||
|  | 
 | ||
|  |    inline T &get_call() { return *call; } | ||
|  | 
 | ||
|  |    inline bool lt(Function inOther) { return call < inOther.call; } | ||
|  |    inline bool gt(Function inOther) { return call > inOther.call; } | ||
|  |    inline bool leq(Function inOther) { return call <= inOther.call; } | ||
|  |    inline bool geq(Function inOther) { return call >= inOther.call; } | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | inline bool operator == (const null &, Function<T> inPtr) { return inPtr.call==0; } | ||
|  | template<typename T> | ||
|  | inline bool operator != (const null &, Function<T> inPtr) { return inPtr.call!=0; } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | class Function_obj | ||
|  | { | ||
|  | public: | ||
|  | 
 | ||
|  | 	inline static AutoCast getProcAddress(String inLib, String inPrim) | ||
|  |    { | ||
|  |       return AutoCast(__hxcpp_get_proc_address(inLib, inPrim,false)); | ||
|  |    } | ||
|  | 
 | ||
|  | 
 | ||
|  |    template<typename T> | ||
|  | 	inline static AutoCast fromStaticFunction(T *inFunction) | ||
|  |    { | ||
|  |       return AutoCast(inFunction); | ||
|  |    } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | class Pointer_obj | ||
|  | { | ||
|  | public: | ||
|  |    template<typename T> | ||
|  | 	inline static AutoCast arrayElem(::Array<T> array, int inIndex)  { return AutoCast(&array[inIndex]); } | ||
|  | 	inline static AutoCast arrayElem(Dynamic inVal, int inIndex) | ||
|  |    { | ||
|  |       if (inVal==null() || !inVal->__IsArray()) | ||
|  |          return AutoCast(0); | ||
|  |       hx::ArrayBase *base = (hx::ArrayBase *)inVal.GetPtr(); | ||
|  |       return AutoCast(base->GetBase() + inIndex*base->GetElementSize()); | ||
|  |    } | ||
|  | 
 | ||
|  |    template<typename T> | ||
|  | 	inline static AutoCast ofArray(::Array<T> array)  { return AutoCast(&array[0]); } | ||
|  | 	inline static AutoCast ofArray(Dynamic inVal) | ||
|  |    { | ||
|  |       if (inVal==null() || !inVal->__IsArray()) | ||
|  |          return AutoCast(0); | ||
|  |       hx::ArrayBase *base = (hx::ArrayBase *)inVal.GetPtr(); | ||
|  |       return AutoCast(base->GetBase()); | ||
|  |    } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |    template<typename T> | ||
|  | 	inline static Pointer<T> addressOf(T &value)  { return Pointer<T>(&value); } | ||
|  | 
 | ||
|  |    template<typename T> | ||
|  | 	inline static Pointer<void> endOf(hx::ObjectPtr<T> value)  { return (void *)(value.mPtr+1); } | ||
|  | 
 | ||
|  |    template<typename T> | ||
|  | 	inline static Pointer<T> fromPointer(T *value)  { return Pointer<T>(value); } | ||
|  |    template<typename T> | ||
|  | 	inline static Pointer<T> fromPointer(const T *value)  { return Pointer<T>(value); } | ||
|  | 
 | ||
|  |    template<typename T> | ||
|  | 	inline static Pointer<T> fromRaw(T *value)  { return Pointer<T>(value); } | ||
|  |    template<typename T> | ||
|  | 	inline static Pointer<T> fromRaw(const T *value)  { return Pointer<T>(value); } | ||
|  | 	inline static Pointer<void> fromRaw(const AutoCast &inAutoCast)  { return Pointer<void>(inAutoCast.value); } | ||
|  | 	inline static Pointer<void> fromRaw(const RawAutoCast &inAutoCast)  { return Pointer<void>(inAutoCast.value); } | ||
|  | 
 | ||
|  | 
 | ||
|  |    inline static AutoCast fromHandle(Dynamic inValue, String inKind) | ||
|  |    { | ||
|  |       if (inValue==null() || (inKind!=null() && inKind!=__hxcpp_get_kind(inValue))) | ||
|  |          return AutoCast(0); | ||
|  |       return AutoCast(inValue->__GetHandle()); | ||
|  |    } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | class Reference_obj | ||
|  | { | ||
|  | public: | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | } // end namespace cpp
 | ||
|  | 
 | ||
|  | namespace hx | ||
|  | { | ||
|  | template <typename T> | ||
|  | T *StarOf(T &x) { return &x; } | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif
 |