Browse Source

Added ArrayCopy() function.
Fixed bbArrayNewStruct parameter order.

woollybah 8 years ago
parent
commit
be7afbab75
3 changed files with 69 additions and 27 deletions
  1. 5 0
      blitz.mod/blitz.bmx
  2. 61 26
      blitz.mod/blitz_array.c
  3. 3 1
      blitz.mod/blitz_array.h

+ 5 - 0
blitz.mod/blitz.bmx

@@ -454,6 +454,11 @@ returns: The object associated with the integer handle
 End Rem
 Function HandleToObject:Object( handle:Size_T )="bbHandleToObject"
 
+Rem
+bbdoc: Copies an array from the specified @src array, starting at the position @srcPos, to the position @dstPos of the destination array.
+End Rem
+Function ArrayCopy(src:Object, srcPos:Int, dst:Object, dstPos:Int, length:Int)="void bbArrayCopy(BBARRAY, int, BBARRAY, int, int)!"
+
 End Extern
 
 'BlitzMax keyword definitions

+ 61 - 26
blitz.mod/blitz_array.c

@@ -66,6 +66,37 @@ static void bbArrayFree( BBObject *o ){
 #endif
 }
 
+static int arrayCellSize(const char * type, unsigned short data_size, int * flags) {
+	int size = 4;
+	
+	switch( type[0] ){
+		case 'b':size=1;break;
+		case 's':size=2;break;
+		case 'l':size=8;break;
+		case 'y':size=8;break;
+		case 'd':size=8;break;
+		case '*':size=sizeof(void*);break;
+		case ':':size=sizeof(void*);*flags=0;break;
+		case '$':size=sizeof(void*);*flags=0;break;
+		case '[':size=sizeof(void*);*flags=0;break;
+		case '(':size=sizeof(void*);break;
+		case 'z':size=sizeof(BBSIZET);break;
+		#ifdef _WIN32
+		case 'w':size=sizeof(WPARAM);break;
+		case 'x':size=sizeof(LPARAM);break;
+		#endif
+		#ifdef __x86_64__
+		case 'h':size=sizeof(BBFLOAT64);break;
+		case 'j':size=sizeof(BBINT128);break;
+		case 'k':size=sizeof(BBFLOAT128);break;
+		case 'm':size=sizeof(BBDOUBLE128);break;
+		#endif
+		case '@':size=data_size;*flags=0;break; // structs
+	}
+
+	return size;
+}
+
 static BBArray *allocateArray( const char *type,int dims,int *lens, unsigned short data_size ){
 	int k,*len;
 	int size=4;
@@ -79,31 +110,8 @@ static BBArray *allocateArray( const char *type,int dims,int *lens, unsigned sho
 		if( n<=0 ) return &bbEmptyArray;
 		length*=n;
 	}
-		
-	switch( type[0] ){
-	case 'b':size=1;break;
-	case 's':size=2;break;
-	case 'l':size=8;break;
-	case 'y':size=8;break;
-	case 'd':size=8;break;
-	case '*':size=sizeof(void*);break;
-	case ':':size=sizeof(void*);flags=0;break;
-	case '$':size=sizeof(void*);flags=0;break;
-	case '[':size=sizeof(void*);flags=0;break;
-	case '(':size=sizeof(void*);break;
-	case 'z':size=sizeof(BBSIZET);break;
-	#ifdef _WIN32
-	case 'w':size=sizeof(WPARAM);break;
-	case 'x':size=sizeof(LPARAM);break;
-	#endif
-	#ifdef __x86_64__
-	case 'h':size=sizeof(BBFLOAT64);break;
-	case 'j':size=sizeof(BBINT128);break;
-	case 'k':size=sizeof(BBFLOAT128);break;
-	case 'm':size=sizeof(BBDOUBLE128);break;
-	#endif
-	case '@':size=data_size;flags=0;break; // structs
-	}
+	
+	size = arrayCellSize(type, data_size, &flags);
 	size*=length;
 
 	arr=(BBArray*)bbGCAllocObject( BBARRAYSIZE(size,dims),&bbArrayClass,flags );
@@ -174,7 +182,7 @@ BBArray *bbArrayNew( const char *type,int dims,... ){
 	return arr;
 }
 
-BBArray *bbArrayNewStruct( const char *type,int dims, unsigned short data_size, ... ){
+BBArray *bbArrayNewStruct( const char *type, unsigned short data_size, int dims, ... ){
 
 	int lens[256];
 
@@ -275,6 +283,33 @@ BBArray *bbArraySlice( const char *type,BBArray *inarr,int beg,int end ){
 	return arr;
 }
 
+void bbArrayCopy(BBArray * srcArr, int srcPos, BBArray * dstArr, int dstPos, int length) {
+
+	if (srcPos < 0 || dstPos < 0 || length <= 0) {
+		return;
+	}
+	
+	if (strcmp(srcArr->type, dstArr->type)) {
+		brl_blitz_ArrayBoundsError();
+	}
+	
+	if (srcPos + length > srcArr->scales[0]) {
+		brl_blitz_ArrayBoundsError();
+	}
+
+	if (dstPos + length > dstArr->scales[0]) {
+		brl_blitz_ArrayBoundsError();
+	}
+	
+	int flags = 0;
+	int size = arrayCellSize(srcArr->type, srcArr->data_size, &flags);
+	
+	char * src = (char*)BBARRAYDATA(srcArr, 1) + srcPos * size;
+	char * dst = (char*)BBARRAYDATA(dstArr, 1) + dstPos * size;
+	
+	memcpy(dst, src, length * size);
+}
+
 BBArray *bbArrayConcat( const char *type,BBArray *x,BBArray *y ){
 
 	BBArray *arr;

+ 3 - 1
blitz.mod/blitz_array.h

@@ -47,9 +47,11 @@ BBArray*	bbArrayConcat( const char *type,BBArray *x,BBArray *y );
 void*	bbArrayIndex( BBArray *, int, int );
 
 BBArray*	bbArrayNew1DStruct( const char *type,int length, unsigned short data_size );
-BBArray*	bbArrayNewStruct( const char *type,int dims, unsigned short data_size,... );
+BBArray*	bbArrayNewStruct( const char *type,unsigned short data_size, int dims, ... );
 BBArray*	bbArrayFromDataStruct( const char *type,int length,void *data, unsigned short data_size );
 
+void bbArrayCopy(BBArray * srcArr, int srcPos, BBArray * dstArr, int dstPos, int length);
+
 #ifdef __cplusplus
 }
 #endif