浏览代码

More array reworking.
Now caches data offset in array so it doesn't need to calculate it every time.

woollybah 9 年之前
父节点
当前提交
85706add38
共有 2 个文件被更改,包括 17 次插入13 次删除
  1. 5 3
      blitz.mod/blitz_array.c
  2. 12 10
      blitz.mod/blitz_array.h

+ 5 - 3
blitz.mod/blitz_array.c

@@ -37,6 +37,7 @@ BBArray bbEmptyArray={
 	0,			//dims
 	0,			//size
 	0,			//data_size
+	0,			//data_start
 	0			//scales[0]
 };
 
@@ -65,7 +66,7 @@ static void bbArrayFree( BBObject *o ){
 #endif
 }
 
-static BBArray *allocateArray( const char *type,int dims,int *lens, int data_size ){
+static BBArray *allocateArray( const char *type,int dims,int *lens, unsigned short data_size ){
 	int k,*len;
 	int size=4;
 	int length=1;
@@ -101,6 +102,7 @@ static BBArray *allocateArray( const char *type,int dims,int *lens, int data_siz
 	arr->dims=dims;
 	arr->size=size;
 	arr->data_size = data_size;
+	arr->data_start = (offsetof(BBArray, scales) + dims * sizeof(int)+0x0f) & ~0x0f; // 16-byte aligned
 	
 	len=lens;
 	for( k=0;k<dims;++k ) arr->scales[k]=*len++;
@@ -162,7 +164,7 @@ BBArray *bbArrayNew( const char *type,int dims,... ){
 	return arr;
 }
 
-BBArray *bbArrayNewStruct( const char *type,int dims, int data_size, ... ){
+BBArray *bbArrayNewStruct( const char *type,int dims, unsigned short data_size, ... ){
 
 	int lens[256];
 
@@ -201,7 +203,7 @@ BBArray *bbArrayNew1D( const char *type,int length ){
 	return arr;
 }
 
-BBArray *bbArrayNew1DStruct( const char *type,int length, int data_size ){
+BBArray *bbArrayNew1DStruct( const char *type,int length, unsigned short data_size ){
 
 	BBArray *arr=allocateArray( type,1,&length, data_size );
 	

+ 12 - 10
blitz.mod/blitz_array.h

@@ -11,18 +11,20 @@ extern "C"{
 #define BBNULLARRAY (&bbEmptyArray)
 
 #define BBARRAYSIZE(q,n) (((offsetof(BBArray, scales) + n * sizeof(int)+0x0f) & ~0x0f)+(q))
-#define BBARRAYDATA(p,n) ((void*)((char*)(p)+((offsetof(BBArray, scales) + n * sizeof(int)+0x0f) & ~0x0f)))
+//#define BBARRAYDATA(p,n) ((void*)((char*)(p)+((offsetof(BBArray, scales) + n * sizeof(int)+0x0f) & ~0x0f)))
+#define BBARRAYDATA(p,n) ((void*)((char*)(p)+((BBArray*)(p))->data_start))
 #define BBARRAYDATAINDEX(p,n,i) bbArrayIndex(p,n,i)
 
 struct BBArray{
 	//extends BBObject
-	BBClass*	clas;
-
-	const char* type;			//
-	int			dims;			//
-	unsigned int size;			// total size minus this header
-	int			data_size;		// size of data element
-	int			scales[1];		// [dims]
+	BBClass*        clas;
+
+	const char*     type;       //
+	unsigned int    dims;       //
+	unsigned int    size;       // total size minus this header
+	unsigned short  data_size;  // size of data element
+	unsigned short  data_start; // start offset of data
+	unsigned int    scales[1];  // [dims]
 };
 
 extern		BBClass bbArrayClass;
@@ -44,8 +46,8 @@ BBArray*	bbArrayConcat( const char *type,BBArray *x,BBArray *y );
 
 void*	bbArrayIndex( BBArray *, int, int );
 
-BBArray*	bbArrayNew1DStruct( const char *type,int length, int data_size );
-BBArray*	bbArrayNewStruct( const char *type,int dims, int data_size,... );
+BBArray*	bbArrayNew1DStruct( const char *type,int length, unsigned short data_size );
+BBArray*	bbArrayNewStruct( const char *type,int dims, unsigned short data_size,... );
 
 #ifdef __cplusplus
 }