forked from LeenkxTeam/LNXSDK
Update Files
This commit is contained in:
183
Kha/Backends/Kinc-hxcpp/khacpp/include/hx/Native.h
Normal file
183
Kha/Backends/Kinc-hxcpp/khacpp/include/hx/Native.h
Normal file
@ -0,0 +1,183 @@
|
||||
#ifndef HX_NATIVE_INCLUDED_H
|
||||
#define HX_NATIVE_INCLUDED_H
|
||||
/*
|
||||
*
|
||||
This file is in the public domain, and can be freely distributed.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef HXCPP_H
|
||||
#define HXCPP_H
|
||||
typedef double Float;
|
||||
typedef void Void;
|
||||
|
||||
//typedef int Int;
|
||||
//typedef bool Bool;
|
||||
|
||||
#ifndef HXCPP_CLASS_ATTRIBUTES
|
||||
#define HXCPP_CLASS_ATTRIBUTES
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#define HX_DECLARE_NATIVE0(klass) \
|
||||
class klass;
|
||||
#define HX_DECLARE_NATIVE1(ns1,klass) namespace ns1 { HX_DECLARE_NATIVE0(klass) }
|
||||
#define HX_DECLARE_NATIVE2(ns2,ns1,klass) namespace ns2 { HX_DECLARE_NATIVE1(ns1,klass) }
|
||||
#define HX_DECLARE_NATIVE3(ns3,ns2,ns1,klass) namespace ns3 { HX_DECLARE_NATIVE2(ns2,ns1,klass) }
|
||||
#define HX_DECLARE_NATIVE4(ns4,ns3,ns2,ns1,klass) namespace ns4 { HX_DECLARE_NATIVE3(ns3,ns2,ns1,klass) }
|
||||
#define HX_DECLARE_NATIVE5(ns5,ns4,ns3,ns2,ns1,klass) namespace ns5 { HX_DECLARE_NATIVE4(ns4,ns3,ns2,ns1,klass) }
|
||||
#define HX_DECLARE_NATIVE6(ns6,ns5,ns4,ns3,ns2,ns1,klass) namespace ns6 { HX_DECLARE_NATIVE5(ns5,ns4,ns3,ns2,ns1,klass) }
|
||||
#define HX_DECLARE_NATIVE7(ns7,ns6,ns5,ns4,ns3,ns2,ns1,klass) namespace ns7 { HX_DECLARE_NATIVE6(ns6,ns5,ns4,ns3,ns2,ns1,klass) }
|
||||
#define HX_DECLARE_NATIVE8(ns8,ns7,ns6,ns5,ns4,ns3,ns2,ns1,klass) namespace ns8 { HX_DECLARE_NATIVE7(ns7,ns6,ns5,ns4,ns3,ns2,ns1,klass) }
|
||||
#define HX_DECLARE_NATIVE9(ns9,ns8,ns7,ns6,ns5,ns4,ns3,ns2,ns1,klass) namespace ns9 { HX_DECLARE_NATIVE8(ns8,ns7,ns6,ns5,ns4,ns3,ns2,ns1,klass) }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
namespace hx
|
||||
{
|
||||
class Object;
|
||||
|
||||
class HXCPP_CLASS_ATTRIBUTES NativeInterface
|
||||
{
|
||||
public:
|
||||
virtual hx::Object *__GetRealObject() = 0;
|
||||
void _hx_addRef();
|
||||
void _hx_decRef();
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class Native
|
||||
{
|
||||
public:
|
||||
T ptr;
|
||||
|
||||
Native () : ptr(0) { }
|
||||
Native (T inPtr) : ptr(inPtr) { }
|
||||
Native (const Native<T> &inNative) : ptr(inNative.ptr) { }
|
||||
#ifdef CPP_VARIANT_ONCE_H
|
||||
Native (const cpp::Variant &inVariant) {
|
||||
hx::Object *obj = inVariant.asObject();
|
||||
ptr = obj ? (T)inVariant.valObject->__GetHandle() : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
inline Native &operator=(T inPtr) { ptr=inPtr; return *this; }
|
||||
inline Native &operator=(const Native<T> &inNative) { ptr=inNative.ptr; return *this; }
|
||||
#ifdef HX_NULL_H
|
||||
inline Native &operator=(const ::null &) { ptr=0; return *this; }
|
||||
#endif
|
||||
inline T operator->() const { return ptr; }
|
||||
|
||||
inline operator T() const { return ptr; }
|
||||
|
||||
template<typename O>
|
||||
inline bool operator==(const Native<O> &inOther) const
|
||||
{ return ptr == inOther.ptr; }
|
||||
template<typename O>
|
||||
inline bool operator!=(const Native<O> &inOther) const
|
||||
{ return ptr != inOther.ptr; }
|
||||
|
||||
};
|
||||
|
||||
HXCPP_CLASS_ATTRIBUTES const char *Init();
|
||||
HXCPP_CLASS_ATTRIBUTES void PushTopOfStack(void *);
|
||||
HXCPP_CLASS_ATTRIBUTES void PopTopOfStack();
|
||||
HXCPP_CLASS_ATTRIBUTES void GcAddOffsetRoot(void *inRoot, int inOffset);
|
||||
HXCPP_CLASS_ATTRIBUTES void GcSetOffsetRoot(void *inRoot, int inOffset);
|
||||
HXCPP_CLASS_ATTRIBUTES void GcRemoveOffsetRoot(void *inRoot);
|
||||
HXCPP_CLASS_ATTRIBUTES int GcGetThreadAttachedCount();
|
||||
|
||||
class HXCPP_CLASS_ATTRIBUTES NativeAttach
|
||||
{
|
||||
bool isAttached;
|
||||
public:
|
||||
NativeAttach(bool inAttach=true)
|
||||
{
|
||||
isAttached = false;
|
||||
if (inAttach)
|
||||
attach();
|
||||
}
|
||||
~NativeAttach()
|
||||
{
|
||||
detach();
|
||||
}
|
||||
void attach()
|
||||
{
|
||||
if (!isAttached)
|
||||
{
|
||||
isAttached = true;
|
||||
hx::PushTopOfStack(this);
|
||||
}
|
||||
}
|
||||
void detach()
|
||||
{
|
||||
if (isAttached)
|
||||
{
|
||||
isAttached = false;
|
||||
hx::PopTopOfStack();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class Ref
|
||||
{
|
||||
public:
|
||||
T ptr;
|
||||
|
||||
Ref() : ptr(0) { }
|
||||
Ref(const T &inT) : ptr(0) { setPtr(inT); }
|
||||
template<typename O>
|
||||
inline Ref(const Native<O> &inNative) : ptr(0) { setPtr(inNative.ptr); }
|
||||
template<typename O>
|
||||
inline Ref(const Ref<O> &inRef) : ptr(0) { setPtr(inRef.ptr); }
|
||||
|
||||
~Ref() { setPtr(0); }
|
||||
void setPtr(T inPtr)
|
||||
{
|
||||
hx::Object *old = ptr ? ptr->__GetRealObject() : 0;
|
||||
int oldOffset = old ? (int)(size_t)((char *)inPtr - (char *)old) : 0;
|
||||
hx::Object *next = inPtr ? inPtr->__GetRealObject() : 0;
|
||||
int nextOffset = next ? (int)(size_t)((char *)inPtr - (char *)next) : 0;
|
||||
|
||||
ptr = inPtr;
|
||||
if (next)
|
||||
{
|
||||
if (!old)
|
||||
GcAddOffsetRoot(&ptr, nextOffset);
|
||||
else if (oldOffset!=nextOffset)
|
||||
GcSetOffsetRoot(&ptr, nextOffset);
|
||||
}
|
||||
else if (old)
|
||||
GcRemoveOffsetRoot(&ptr);
|
||||
}
|
||||
|
||||
inline Ref &operator=(const T &inPtr) { setPtr(inPtr); return *this; }
|
||||
template<typename O>
|
||||
inline Ref &operator=(const Native<O> &inNative) { setPtr(inNative.ptr); return *this; }
|
||||
template<typename O>
|
||||
inline Ref &operator=(const Ref<O> &inRef) { setPtr(inRef.ptr); return *this; }
|
||||
|
||||
template<typename O>
|
||||
inline bool operator==(const Ref<O> &inOther) const
|
||||
{ return ptr == inOther.ptr; }
|
||||
template<typename O>
|
||||
inline bool operator!=(const Ref<O> &inOther) const
|
||||
{ return ptr != inOther.ptr; }
|
||||
|
||||
T operator->() { return ptr; }
|
||||
};
|
||||
|
||||
#define HX_NATIVE_IMPLEMENTATION hx::Object *__GetRealObject() { return this; }
|
||||
#define HX_EXTERN_NATIVE_IMPLEMENTATION hx::Object *__GetRealObject() { return 0; }
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user