forked from LeenkxTeam/LNXSDK
265 lines
6.2 KiB
Plaintext
265 lines
6.2 KiB
Plaintext
#include <hxcpp.h>
|
|
#include <math.h>
|
|
#include <hxMath.h>
|
|
#include <stdio.h>
|
|
|
|
using namespace hx;
|
|
|
|
|
|
|
|
@implementation NSHaxeWrapperClass
|
|
|
|
- (id)init:( hx::Object * ) inHaxe {
|
|
self = [super init];
|
|
haxeObject = inHaxe;
|
|
hx::GCAddRoot(&haxeObject);
|
|
if (self!=nil) {
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc {
|
|
GCRemoveRoot(&haxeObject);
|
|
#ifndef OBJC_ARC
|
|
[super dealloc];
|
|
#endif
|
|
}
|
|
@end
|
|
|
|
|
|
|
|
id _hx_value_to_objc(Dynamic d)
|
|
{
|
|
if (!d.mPtr)
|
|
return nil;
|
|
|
|
switch(d->__GetType())
|
|
{
|
|
case vtNull:
|
|
case vtUnknown:
|
|
return nil;
|
|
|
|
case vtInt:
|
|
case vtBool:
|
|
return [ NSNumber numberWithInt: (int)d ];
|
|
case vtInt64:
|
|
return [ NSNumber numberWithLongLong: (cpp::Int64)d ];
|
|
case vtFloat:
|
|
return [ NSNumber numberWithDouble: (double)d ];
|
|
case vtString:
|
|
return (NSString *)String(d);
|
|
case vtObject:
|
|
return _hx_obj_to_nsdictionary(d);
|
|
case vtArray:
|
|
{
|
|
Array_obj<unsigned char> *bytes = dynamic_cast< Array_obj<unsigned char> * >(d.mPtr);
|
|
if (bytes)
|
|
{
|
|
if (!bytes->length)
|
|
return [NSData alloc];
|
|
else
|
|
return [NSData dataWithBytes:bytes->GetBase() length:bytes->length];
|
|
}
|
|
else
|
|
{
|
|
cpp::VirtualArray varray = d;
|
|
int len = varray->get_length();
|
|
NSMutableArray *array = [NSMutableArray arrayWithCapacity:len];
|
|
for(int i=0;i<len;i++)
|
|
array[i] = _hx_value_to_objc( varray->__get(i) );
|
|
return array;
|
|
}
|
|
}
|
|
case vtClass:
|
|
if (d->__GetClass()->mName==HX_CSTRING("haxe.io.Bytes"))
|
|
{
|
|
return _hx_value_to_objc( d->__Field( HX_CSTRING("b"), hx::paccDynamic ) );
|
|
}
|
|
// else fallthough...
|
|
|
|
case vtFunction:
|
|
case vtEnum:
|
|
case vtAbstractBase:
|
|
{
|
|
return (NSString *)d->toString();
|
|
}
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
|
|
NSDictionary<NSString *, id> *_hx_obj_to_nsdictionary(Dynamic d)
|
|
{
|
|
if (d==null())
|
|
return nil;
|
|
|
|
Array<String> fields = Array_obj<String>::__new();
|
|
d->__GetFields(fields);
|
|
|
|
NSMutableArray *objects = [[NSMutableArray alloc] initWithCapacity:fields->length ];
|
|
NSMutableArray *keys = [[NSMutableArray alloc] initWithCapacity:fields->length ];
|
|
for(int i=0; i <fields->length; i++)
|
|
{
|
|
objects[i] = _hx_value_to_objc( d->__Field(fields[i], hx::paccDynamic ) );
|
|
keys[i] = (NSString *)fields[i];
|
|
}
|
|
|
|
NSDictionary *result = [NSDictionary<NSString *,id> dictionaryWithObjects:objects forKeys:keys];
|
|
|
|
return result;
|
|
}
|
|
|
|
Array<unsigned char> _hx_objc_to_bytes(id value)
|
|
{
|
|
NSData *data = value;
|
|
return Array_obj<unsigned char>::fromData((const unsigned char *)data.bytes, data.length);
|
|
}
|
|
|
|
hx::Val _hx_objc_to_value(id value)
|
|
{
|
|
if (value==nil)
|
|
return null();
|
|
|
|
else if ([value isKindOfClass:[NSNumber class]])
|
|
return [value floatValue];
|
|
|
|
else if ([value isKindOfClass:[NSString class]])
|
|
return String( (NSString *)value );
|
|
|
|
else if ([value isKindOfClass:[NSDictionary class]])
|
|
return _hx_nsdictionary_to_obj( (NSDictionary *) value);
|
|
|
|
else if ([value isKindOfClass:[NSArray class]])
|
|
{
|
|
NSArray *array = value;
|
|
cpp::VirtualArray varray = cpp::VirtualArray_obj::__new();
|
|
for(id object in array)
|
|
varray->push( _hx_objc_to_value(object) );
|
|
|
|
return varray;
|
|
}
|
|
else if ([value isKindOfClass:[NSData class]])
|
|
{
|
|
return _hx_objc_to_bytes(value);
|
|
}
|
|
else
|
|
return String( [value stringValue] );
|
|
}
|
|
|
|
|
|
|
|
|
|
Dynamic _hx_nsdictionary_to_obj(NSDictionary<NSString *, id> *inDictionary)
|
|
{
|
|
if (!inDictionary)
|
|
return null();
|
|
hx::Anon obj = new hx::Anon_obj();
|
|
|
|
for (NSString *key in inDictionary)
|
|
{
|
|
id value = inDictionary[key];
|
|
obj->__SetField( String(key), _hx_objc_to_value(value), hx::paccDynamic);
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
|
|
|
|
Dynamic _hx_objc_to_dynamic(id inValue)
|
|
{
|
|
return _hx_objc_to_value(inValue);
|
|
}
|
|
|
|
|
|
|
|
namespace hx {
|
|
|
|
extern hx::Class __ObjcClass;
|
|
|
|
class ObjcData : public hx::Object
|
|
{
|
|
public:
|
|
inline void *operator new( size_t inSize, hx::NewObjectType inAlloc=NewObjAlloc,const char *inName="objc.BoxedType")
|
|
{ return hx::Object::operator new(inSize,inAlloc,inName); }
|
|
|
|
ObjcData(const id inValue) : mValue(inValue)
|
|
{
|
|
#ifndef OBJC_ARC
|
|
[ inValue retain ];
|
|
#endif
|
|
mFinalizer = new hx::InternalFinalizer(this,clean);
|
|
};
|
|
|
|
static void clean(hx::Object *inObj)
|
|
{
|
|
ObjcData *m = dynamic_cast<ObjcData *>(inObj);
|
|
if (m)
|
|
{
|
|
#ifndef OBJC_ARC
|
|
[m->mValue release];
|
|
#else
|
|
m->mValue = nil;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#ifdef HXCPP_VISIT_ALLOCS
|
|
void __Visit(hx::VisitContext *__inCtx) { mFinalizer->Visit(__inCtx); }
|
|
#endif
|
|
|
|
hx::Class __GetClass() const { return hx::__ObjcClass; }
|
|
|
|
#if (HXCPP_API_LEVEL<331)
|
|
bool __Is(hx::Object *inClass) const { return dynamic_cast< ObjcData *>(inClass); }
|
|
#endif
|
|
|
|
// k_cpp_objc
|
|
int __GetType() const { return vtAbstractBase + 4; }
|
|
#ifdef OBJC_ARC
|
|
void * __GetHandle() const { return (__bridge void *) mValue; }
|
|
#else
|
|
void * __GetHandle() const { return (void *) mValue; }
|
|
#endif
|
|
String toString()
|
|
{
|
|
return String(!mValue ? "null" : [[mValue description] UTF8String]);
|
|
}
|
|
String __ToString() const { return String(!mValue ? "null" : [[mValue description] UTF8String]); }
|
|
|
|
int __Compare(const hx::Object *inRHS) const
|
|
{
|
|
if (!inRHS)
|
|
return mValue == 0 ? 0 : 1;
|
|
const ObjcData *data = dynamic_cast< const ObjcData *>(inRHS);
|
|
if (data)
|
|
{
|
|
return [data->mValue isEqual:mValue] ? 0 : mValue < data->mValue ? -1 : 1;
|
|
}
|
|
else
|
|
{
|
|
void *r = inRHS->__GetHandle();
|
|
|
|
#ifdef OBJC_ARC
|
|
void * ptr = (__bridge void *) mValue;
|
|
#else
|
|
void * ptr = (void *) mValue;
|
|
#endif
|
|
|
|
return ptr < r ? -1 : ptr==r ? 0 : 1;
|
|
}
|
|
}
|
|
|
|
#ifdef OBJC_ARC
|
|
id mValue;
|
|
#else
|
|
const id mValue;
|
|
#endif
|
|
hx::InternalFinalizer *mFinalizer;
|
|
};
|
|
}
|
|
|
|
Dynamic::Dynamic(const id inVal)
|
|
{
|
|
mPtr = inVal ? (hx::Object *)new ObjcData(inVal) : 0;
|
|
}
|