Ver Fonte

Add new member functions to array

mingodad há 6 anos atrás
pai
commit
e03a8510fb

+ 2 - 0
SquiLu/include/sqapi.h

@@ -163,6 +163,8 @@ SQUIRREL_API_FUNC(SQRESULT, arrayinsert, (HSQUIRRELVM v,SQInteger idx,SQInteger
 SQUIRREL_API_FUNC(SQRESULT, arrayget, (HSQUIRRELVM v,SQInteger idx,SQInteger pos))
 SQUIRREL_API_FUNC(SQRESULT, arrayget, (HSQUIRRELVM v,SQInteger idx,SQInteger pos))
 SQUIRREL_API_FUNC(SQRESULT, arrayset, (HSQUIRRELVM v,SQInteger idx,SQInteger destpos))
 SQUIRREL_API_FUNC(SQRESULT, arrayset, (HSQUIRRELVM v,SQInteger idx,SQInteger destpos))
 SQUIRREL_API_FUNC(SQRESULT, arraygetsizeof, (HSQUIRRELVM v,SQInteger idx))
 SQUIRREL_API_FUNC(SQRESULT, arraygetsizeof, (HSQUIRRELVM v,SQInteger idx))
+SQUIRREL_API_FUNC(SQRESULT, arraygettype, (HSQUIRRELVM v,SQInteger idx, SQInteger *atype))
+SQUIRREL_API_FUNC(SQRESULT, arraygetrawdata, (HSQUIRRELVM v,SQInteger idx, void **rdata))
 SQUIRREL_API_FUNC(SQRESULT, setdelegate, (HSQUIRRELVM v,SQInteger idx))
 SQUIRREL_API_FUNC(SQRESULT, setdelegate, (HSQUIRRELVM v,SQInteger idx))
 SQUIRREL_API_FUNC(SQRESULT, getdelegate, (HSQUIRRELVM v,SQInteger idx))
 SQUIRREL_API_FUNC(SQRESULT, getdelegate, (HSQUIRRELVM v,SQInteger idx))
 SQUIRREL_API_FUNC(SQRESULT, clone, (HSQUIRRELVM v,SQInteger idx))
 SQUIRREL_API_FUNC(SQRESULT, clone, (HSQUIRRELVM v,SQInteger idx))

+ 10 - 0
SquiLu/include/squirrel.h

@@ -44,6 +44,16 @@ extern "C" {
 #define SQTrue	(1)
 #define SQTrue	(1)
 #define SQFalse	(0)
 #define SQFalse	(0)
 
 
+enum SQEnumArrayTypes {
+    eat_SQArray = 1,
+    eat_SQFloat64Array,
+    eat_SQFloat32Array,
+    eat_SQInt64Array,
+    eat_SQInt32Array,
+    eat_SQInt16Array,
+    eat_SQInt8Array,
+};
+
 struct SQVM;
 struct SQVM;
 struct SQTable;
 struct SQTable;
 struct SQArrayBase;
 struct SQArrayBase;

+ 14 - 0
SquiLu/squirrel/sqapi.cpp

@@ -519,6 +519,20 @@ SQRESULT sq_arraygetsizeof(HSQUIRRELVM v,SQInteger idx)
 	return SQ_OK;
 	return SQ_OK;
 }
 }
 
 
+SQRESULT sq_arraygettype(HSQUIRRELVM v,SQInteger idx, SQInteger *atype)
+{
+    CHECK_ARRAY_AT(idx, arr);
+    *atype = _array(arr)->GetArrayType();
+	return SQ_OK;
+}
+
+SQRESULT sq_arraygetrawdata(HSQUIRRELVM v,SQInteger idx, void **rdata)
+{
+    CHECK_ARRAY_AT(idx, arr);
+    *rdata = _array(arr)->RawData();
+	return SQ_OK;
+}
+
 void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars)
 void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars)
 {
 {
 	SQNativeClosure *nc = SQNativeClosure::Create(_ss(v), func,nfreevars);
 	SQNativeClosure *nc = SQNativeClosure::Create(_ss(v), func,nfreevars);

+ 7 - 1
SquiLu/squirrel/sqarray.h

@@ -2,13 +2,14 @@
 #ifndef _SQARRAY_H_
 #ifndef _SQARRAY_H_
 #define _SQARRAY_H_
 #define _SQARRAY_H_
 
 
+
 struct SQArrayBase : public CHAINABLE_OBJ
 struct SQArrayBase : public CHAINABLE_OBJ
 {
 {
 protected:
 protected:
 	SQArrayBase(SQSharedState *ss,SQInteger nsize){
 	SQArrayBase(SQSharedState *ss,SQInteger nsize){
 	    INIT_CHAIN();
 	    INIT_CHAIN();
 	    ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);
 	    ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);
-    }
+	}
 	~SQArrayBase()
 	~SQArrayBase()
 	{
 	{
 		REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
 		REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
@@ -57,6 +58,8 @@ public:
 		return -1;
 		return -1;
 	}
 	}
 	ABSTRACT_METHOD(virtual SQArrayBase *Clone(bool withData=true), { return NULL;})
 	ABSTRACT_METHOD(virtual SQArrayBase *Clone(bool withData=true), { return NULL;})
+	ABSTRACT_METHOD(virtual void *RawData(), { return NULL;})
+	ABSTRACT_METHOD(virtual SQInteger GetArrayType(), { return 0;})
 	ABSTRACT_METHOD(virtual SQUnsignedInteger SizeOf() const, { return 0;})
 	ABSTRACT_METHOD(virtual SQUnsignedInteger SizeOf() const, { return 0;})
 	ABSTRACT_METHOD(virtual SQUnsignedInteger Size() const, { return 0;})
 	ABSTRACT_METHOD(virtual SQUnsignedInteger Size() const, { return 0;})
 	bool Resize(SQUnsignedInteger size)
 	bool Resize(SQUnsignedInteger size)
@@ -122,6 +125,7 @@ private:
 	    return anew;\
 	    return anew;\
     }\
     }\
 	void Release(){sq_delete(this,atype);}\
 	void Release(){sq_delete(this,atype);}\
+	virtual SQInteger GetArrayType() { return eat_##atype;} \
 	void DummyPinVtable();
 	void DummyPinVtable();
 
 
 struct SQArray : public SQArrayBase
 struct SQArray : public SQArrayBase
@@ -163,6 +167,7 @@ public:
 	{
 	{
         out = _vec_values[idx];
         out = _vec_values[idx];
 	}
 	}
+	virtual void *RawData() { return NULL;}
 private:
 private:
 
 
     virtual void _getObjectPtr(const SQInteger nidx,SQObjectPtr &val){
     virtual void _getObjectPtr(const SQInteger nidx,SQObjectPtr &val){
@@ -238,6 +243,7 @@ public:
         _vec_values[idx1] = tv;
         _vec_values[idx1] = tv;
         return true;
         return true;
 	}
 	}
+	virtual void *RawData() { return _vec_values._vals;}
 private:
 private:
 
 
     virtual bool _setObjectPtr(const SQInteger nidx, const SQObjectPtr &val){
     virtual bool _setObjectPtr(const SQInteger nidx, const SQObjectPtr &val){