#ifndef HXCPP_H #define HXCPP_H #include #ifdef __clang__ #pragma clang diagnostic ignored "-Wunused-variable" #pragma clang diagnostic ignored "-Wunused-value" #pragma clang diagnostic ignored "-Wunreachable-code" #pragma clang diagnostic ignored "-Wshorten-64-to-32" #pragma clang diagnostic ignored "-Winvalid-offsetof" #pragma clang diagnostic ignored "-Wparentheses-equality" #pragma clang diagnostic ignored "-Wconditional-uninitialized" #pragma clang diagnostic ignored "-Wreorder" #pragma clang diagnostic ignored "-Wself-assign" #pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" #pragma clang diagnostic ignored "-Woverloaded-virtual" #pragma clang diagnostic ignored "-Wsometimes-uninitialized" #else #pragma warning(disable : 4018 4101 4146 4244 4305 4127 4100 4267 4389 4201 4312 4244 4996 4457 4458 4189 4701 4702) #endif // Standard headers .... #include // Windows hack #define NOMINMAX #ifndef HXCPP_API_LEVEL #define HXCPP_API_LEVEL 0 #endif #include "hx/HeaderVersion.h" #if defined(_MSC_VER) || defined(__BORLANDC__) #if _MSC_VER >= 1423 #include #else #include #endif #if defined(__BORLANDC__) namespace hx { typedef std::type_info type_info; } #else namespace hx { typedef ::type_info type_info; } #endif #else #include #include #include namespace hx { typedef std::type_info type_info; } #ifndef EMSCRIPTEN using hx::type_info; #ifdef __MINGW32__ #include #else typedef int64_t __int64; #endif #endif #endif #if defined(EMSCRIPTEN) || defined(IPHONE) || defined(APPLETV) #include #include #endif #if defined(EMSCRIPTEN) #include #endif #ifdef __OBJC__ #ifdef HXCPP_OBJC #import #endif #endif #include #include #ifdef HX_LINUX #include #include #include #endif #if defined(EMSCRIPTEN) || defined(_ARM_) || defined(__arm__) || defined(GCW0) #define HXCPP_ALIGN_FLOAT #endif // Must allign allocs to 8 bytes to match floating point requirement? // Ints must br read on 4-byte boundary #if defined(EMSCRIPTEN) || defined(GCW0) #define HXCPP_ALIGN_ALLOC #endif #if defined(__LP64__) || defined(_LP64) || defined(_WIN64) #if !defined(HXCPP_M64) #define HXCPP_M64 #endif #endif // Some compilers are over-enthusiastic about what they #define ... //#ifdef NULL //#undef NULL //#endif #ifdef assert #undef assert #endif #define HXCPP_CLASS_ATTRIBUTES #ifdef _MSC_VER #if defined(HXCPP_DLL_IMPORT) #define HXCPP_EXTERN_CLASS_ATTRIBUTES __declspec(dllimport) #elif defined (HXCPP_DLL_EXPORT) #define HXCPP_EXTERN_CLASS_ATTRIBUTES __declspec(dllexport) #else #define HXCPP_EXTERN_CLASS_ATTRIBUTES #endif #else #if defined(HXCPP_DLL_EXPORT) #define HXCPP_EXTERN_CLASS_ATTRIBUTES __attribute__((visibility("default"))) #else #define HXCPP_EXTERN_CLASS_ATTRIBUTES #endif #endif typedef char HX_CHAR; #if (defined(HXCPP_DEBUG) || defined(HXCPP_DEBUGGER)) && !defined HXCPP_CHECK_POINTER #define HXCPP_CHECK_POINTER #endif #ifdef HX_WINRT #define WINRT_LOG(fmt, ...) {char buf[1024];sprintf_s(buf,1024,"****LOG: %s(%d): %s \n [" fmt "]\n",__FILE__,__LINE__,__FUNCTION__, __VA_ARGS__);OutputDebugStringA(buf);} #define WINRT_PRINTF(fmt, ...) {char buf[2048];sprintf_s(buf,2048,fmt,__VA_ARGS__);OutputDebugStringA(buf);} #endif #ifdef BIG_ENDIAN #undef BIG_ENDIAN #ifndef HXCPP_BIG_ENDIAN #define HXCPP_BIG_ENDIAN #endif #endif #ifdef __BIG_ENDIAN__ #ifndef HXCPP_BIG_ENDIAN #define HXCPP_BIG_ENDIAN #endif #endif #ifdef LITTLE_ENDIAN #undef LITTLE_ENDIAN #ifdef HXCPP_BIG_ENDIAN #undef HXCPP_BIG_ENDIAN #endif #endif #ifdef __LITTLE_ENDIAN__ #ifdef HXCPP_BIG_ENDIAN #undef HXCPP_BIG_ENDIAN #endif #endif // HX_HCSTRING is for constant strings with built-in hashes // HX_GC_CONST_ALLOC_BIT | HX_GC_STRING_HASH // HX_CSTRING is for constant strings without built-in hashes // HX_GC_CONST_ALLOC_BIT // HX_GC_CONST_ALLOC_BIT = 0x80000000 // HX_GC_STRING_HASH = 0x00100000 // HX_GC_STRING_CHAR16_T = 0x00200000 // For making generated code easier to read #define HX_HASH_JOIN(A, B) A##B #define HX_JOIN_PARTS(A, B) HX_HASH_JOIN(A, B) #define HX_HASH_OF(A) #A #define HX_HASH_OF_W(A) HX_HASH_JOIN(u,#A) #define HX_STR_QUOTE(A) HX_HASH_OF(A) #define HX_STR_QUOTE_W(A) HX_HASH_OF_W(A) #define HX_HEX_QUOTE(hex) HX_STR_QUOTE(HX_JOIN_PARTS(\x,hex)) #define HX_HEX_QUOTE_W(hex) HX_STR_QUOTE_W(HX_JOIN_PARTS(\x,hex)) #ifdef HXCPP_BIG_ENDIAN #define HX_HCSTRING(s,h0,h1,h2,h3) ::String( const_cast((h3 h2 h1 h0 "\x80\x10\x00\x00" s)) + 8 , sizeof(s)/sizeof(char)-1) #define HX_(s,h0,h1,h2,h3) ::String( const_cast(( HX_HEX_QUOTE(h3) HX_HEX_QUOTE(h2) HX_HEX_QUOTE(h1) HX_HEX_QUOTE(h0) "\x80\x10\x00\x00" s )) + 8 , sizeof(s)/sizeof(char)-1) #define HX_STRINGI(s,len) ::String( const_cast(("\x80\x00\x00\x00" s)) + 4 ,len) #define HX_W(s,h0,h1) ::String( const_cast(( HX_HEX_QUOTE_W(h1) HX_HEX_QUOTE_W(h0) u"\x8030\x0000" s )) + 4, sizeof(s)/2-1) #else #define HX_HCSTRING(s,h0,h1,h2,h3) ::String( const_cast((h0 h1 h2 h3 "\x00\x00\x10\x80" s )) + 8 , sizeof(s)/sizeof(char)-1) #define HX_(s,h0,h1,h2,h3) ::String( const_cast(( HX_HEX_QUOTE(h0) HX_HEX_QUOTE(h1) HX_HEX_QUOTE(h2) HX_HEX_QUOTE(h3) "\x00\x00\x10\x80" s )) + 8 , sizeof(s)/sizeof(char)-1) #define HX_STRINGI(s,len) ::String( const_cast(("\x00\x00\x0\x80" s)) + 4 ,len) #define HX_W(s,h0,h1) ::String( const_cast(( HX_HEX_QUOTE_W(h0) HX_HEX_QUOTE_W(h1) u"\x0000\x8030" s )) + 4, sizeof(s)/2-1) #endif #define HX_STRI(s) HX_STRINGI(s,sizeof(s)/sizeof(char)-1) #define HX_CSTRING(x) HX_STRI(x) #define HX_CSTRING2(wide,len,utf8) HX_STRI(utf8) #ifdef HX_SMART_STRINGS #define HX_FIELD_EQ(name,field) (name.isAsciiEncoded() && !::memcmp(name.raw_ptr(), field, sizeof(field)/sizeof(char))) // No null check is performedd... #define HX_QSTR_EQ(name,field) (name.length==field.length && field.isAsciiEncodedQ() && !::memcmp(name.raw_ptr(), field.raw_ptr() , field.length) ) // field is known to be isAsciiEncodedQ #define HX_QSTR_EQ_AE(name,field) (name.length==field.length && !::memcmp(name.raw_ptr(), field.raw_ptr() , field.length) ) #else #define HX_FIELD_EQ(name,field) !::memcmp(name.__s, field, sizeof(field)/sizeof(char)) // No null check is performed.... #define HX_QSTR_EQ(name,field) (name.length==field.length && !::memcmp(name.__s, field.__s, field.length)) #define HX_QSTR_EQ_AE(name,field) (name.length==field.length && !::memcmp(name.__s, field.__s, field.length)) #endif #if defined(_MSC_VER) #pragma warning(disable:4251) #pragma warning(disable:4800) #endif #if defined(_MSC_VER) && _MSC_VER < 1201 #error MSVC 7.1 does not support template specialization and is not supported by HXCPP #endif // HXCPP includes... // Basic mapping from haxe -> c++ #if (HXCPP_API_LEVEL<=330) typedef int Int; typedef bool Bool; #endif #ifdef HXCPP_FLOAT32 typedef float Float; #else typedef double Float; #endif // Extended mapping - cpp namespace namespace cpp { typedef signed char Int8; typedef unsigned char UInt8; typedef char Char; typedef signed short Int16; typedef unsigned short UInt16; typedef signed int Int32; typedef unsigned int UInt32; #ifdef _WIN32 typedef __int64 Int64; typedef unsigned __int64 UInt64; // TODO - EMSCRIPTEN? #else typedef int64_t Int64; typedef uint64_t UInt64; #endif typedef float Float32; typedef double Float64; typedef volatile int AtomicInt; }; // Extended mapping - old way namespace haxe { namespace io { typedef unsigned char Unsigned_char__; } } // --- Forward decalarations -------------------------------------------- class null; namespace hx { class Object; } namespace hx { class FieldRef; } namespace hx { class IndexRef; } namespace hx { class NativeInterface; } namespace hx { struct StackContext; } namespace hx { template class Native; } namespace hx { template class ObjectPtr; } namespace cpp { template class Struct; } namespace cpp { template class Pointer; } namespace cpp { template class Function; } template class Array_obj; template class Array; namespace hx { class Class_obj; typedef hx::ObjectPtr Class; } namespace cpp { struct Variant; class VirtualArray_obj; class VirtualArray; class CppInt32__; } #if (HXCPP_API_LEVEL < 320) && !defined(__OBJC__) typedef hx::Class Class; typedef hx::Class_obj Class_obj; #endif class Dynamic; class String; // Use an external routine to throw to avoid sjlj overhead on iphone. namespace hx { HXCPP_EXTERN_CLASS_ATTRIBUTES Dynamic Throw(Dynamic inDynamic); } namespace hx { HXCPP_EXTERN_CLASS_ATTRIBUTES Dynamic Rethrow(Dynamic inDynamic); } namespace hx { HXCPP_EXTERN_CLASS_ATTRIBUTES void CriticalError(const String &inError, bool inAllowFixup=false); } namespace hx { HXCPP_EXTERN_CLASS_ATTRIBUTES void NullReference(const char *type, bool allowFixup); } namespace hx { extern String sNone[]; } void __hxcpp_check_overflow(int inVal); namespace hx { class MarkContext; class VisitContext { public: virtual void visitObject(hx::Object **ioPtr)=0; virtual void visitAlloc(void **ioPtr)=0; }; #if (HXCPP_API_LEVEL >= 330) typedef ::cpp::Variant Val; #else typedef ::Dynamic Val; #endif #ifdef HXCPP_GC_GENERATIONAL #define HXCPP_GC_NURSERY #endif //#define HXCPP_COMBINE_STRINGS #if (HXCPP_API_LEVEL >= 313) enum PropertyAccessMode { paccNever = 0, paccDynamic = 1, paccAlways = 2, }; typedef PropertyAccessMode PropertyAccess; #define HX_PROP_NEVER hx::paccNever #define HX_PROP_DYNAMIC hx::paccDynamic #define HX_PROP_ALWAYS hx::paccAlways #else typedef bool PropertyAccess; #define HX_PROP_NEVER false #define HX_PROP_DYNAMIC true #define HX_PROP_ALWAYS true #endif } // end namespace hx #define HX_COMMA , // The order of these includes has been chosen to minimize forward declarations. // You should not include the individual files, just this one. // First time ... #include #include #include #include #include #include "null.h" #include #include "hxString.h" #include "Dynamic.h" #include // This needs to "see" other declarations ... #include #include #include "Array.h" #include #include #include "Enum.h" #include #include #if defined(__OBJC__) && defined(HXCPP_OBJC) #include #endif #include #include #include #include #include // second time ... #include #include #include #include #if (HXCPP_API_LEVEL>=330) #include #else #include #endif #endif