Browse Source

Added struct array defines. (#337)

* Added struct array defines.

* Added struct array defines.

* Can be static
Brucey 8 months ago
parent
commit
03a085a756
3 changed files with 121 additions and 11 deletions
  1. 11 11
      blitz.mod/blitz_array.c
  2. 57 0
      blitz.mod/blitz_array.h
  3. 53 0
      blitz.mod/tests/test.bmx

+ 11 - 11
blitz.mod/blitz_array.c

@@ -88,7 +88,7 @@ static int arrayCellSize(const char * type, unsigned short data_size, int * flag
 	return size;
 }
 
-static BBArray *allocateArray( const char *type,int dims,int *lens, unsigned short data_size ){
+BBArray *bbAllocateArray( const char *type,int dims,int *lens, unsigned short data_size ){
 	int k,*len;
 	unsigned int size=4;
 	int length=1;
@@ -169,7 +169,7 @@ BBArray *bbArrayNew( const char *type,int dims,... ){
 	}
 	va_end(lengths);
 
-	BBArray *arr=allocateArray( type,dims, lens, 0 );
+	BBArray *arr=bbAllocateArray( type,dims, lens, 0 );
 	
 	initializeArray( arr, 0 );
 	
@@ -190,7 +190,7 @@ BBArray *bbArrayNewStruct( const char *type, unsigned short data_size, BBArraySt
 	}
 	va_end(lengths);
 
-	BBArray *arr=allocateArray( type,dims, lens, data_size );
+	BBArray *arr=bbAllocateArray( type,dims, lens, data_size );
 	
 	initializeArray( arr, init );
 	
@@ -199,7 +199,7 @@ BBArray *bbArrayNewStruct( const char *type, unsigned short data_size, BBArraySt
 
 BBArray *bbArrayNewEx( const char *type,int dims,int *lens ){
 
-	BBArray *arr=allocateArray( type,dims,lens,0 );
+	BBArray *arr=bbAllocateArray( type,dims,lens,0 );
 	
 	initializeArray( arr, 0 );
 	
@@ -208,7 +208,7 @@ BBArray *bbArrayNewEx( const char *type,int dims,int *lens ){
 
 BBArray *bbArrayNew1D( const char *type,int length ){
 
-	BBArray *arr=allocateArray( type,1,&length, 0 );
+	BBArray *arr=bbAllocateArray( type,1,&length, 0 );
 	
 	initializeArray( arr, 0 );
 	
@@ -216,12 +216,12 @@ BBArray *bbArrayNew1D( const char *type,int length ){
 }
 
 BBArray *bbArrayNew1DNoInit( const char *type,int length ){
-	return allocateArray( type,1,&length, 0 );
+	return bbAllocateArray( type,1,&length, 0 );
 }
 
 BBArray *bbArrayNew1DStruct( const char *type,int length, unsigned short data_size, BBArrayStructInit init ){
 
-	BBArray *arr=allocateArray( type,1,&length, data_size );
+	BBArray *arr=bbAllocateArray( type,1,&length, data_size );
 	
 	initializeArray( arr, init );
 	
@@ -241,7 +241,7 @@ BBArray *bbArraySliceStruct( const char *type,BBArray *inarr,int beg,int end, un
 
 	if( length<=0 ) return &bbEmptyArray;
 	
-	arr=allocateArray( type,1,&length,data_size );
+	arr=bbAllocateArray( type,1,&length,data_size );
 
 	el_size=arr->size/length;
 	
@@ -342,7 +342,7 @@ BBArray *bbArrayConcat( const char *type,BBArray *x,BBArray *y ){
 		brl_blitz_RuntimeError(bbStringFromCString("Incompatible array element types for concatenation"));
 	}
 
-	arr=allocateArray( type,1,&length, data_size );
+	arr=bbAllocateArray( type,1,&length, data_size );
 	
 	data=(char*)BBARRAYDATA( arr,1 );
 	
@@ -362,7 +362,7 @@ BBArray *bbArrayFromDataSize( const char *type,int length,void *data, unsigned s
 
 	if( length<=0 ) return &bbEmptyArray;
 	
-	arr=allocateArray( type,1,&length,data_size );
+	arr=bbAllocateArray( type,1,&length,data_size );
 
 	memcpy( BBARRAYDATA( arr,1 ),data,arr->size );
 
@@ -375,7 +375,7 @@ BBArray *bbArrayFromDataStruct( const char *type,int length,void *data, unsigned
 
 	if( length<=0 ) return &bbEmptyArray;
 	
-	arr=allocateArray( type,1,&length, data_size );
+	arr=bbAllocateArray( type,1,&length, data_size );
 
 	memcpy( BBARRAYDATA( arr,1 ),data,arr->size );
 

+ 57 - 0
blitz.mod/blitz_array.h

@@ -15,6 +15,61 @@ extern "C"{
 #define BBARRAYDATA(p,n) ((void*)((char*)(p)+((BBArray*)(p))->data_start))
 #define BBARRAYDATAINDEX(p,n,i) bbArrayIndex(p,n,i)
 
+#define BBARRAYNEW1DSTRUCT_FUNC(FUNC_SUFFIX, STRUCT_TYPE, CONSTRUCTOR_FUNC, TYPE_STRING) \
+BBArray *bbArrayNew1DStruct_##FUNC_SUFFIX(int length) { \
+    BBArray *arr = bbAllocateArray(TYPE_STRING, 1, &length, sizeof(struct STRUCT_TYPE)); \
+    if (!arr->size) return arr; \
+    struct STRUCT_TYPE *p = (struct STRUCT_TYPE *)(BBARRAYDATA(arr, arr->dims)); \
+    memset(p, 0, arr->size); \
+    struct STRUCT_TYPE *s = p; \
+    for (int k = arr->scales[0]; k > 0; --k) { \
+        CONSTRUCTOR_FUNC(s); \
+        s++; \
+    } \
+    return arr; \
+}
+
+#define BBARRAYSLICESTRUCT_FUNC(FUNC_SUFFIX, STRUCT_TYPE, CONSTRUCTOR_FUNC, TYPE_STRING) \
+BBArray *bbArraySliceStruct_##FUNC_SUFFIX(BBArray *inarr, int beg, int end) { \
+    int k; \
+    int length = end - beg; \
+    if (length <= 0) return &bbEmptyArray; \
+    BBArray *arr = bbAllocateArray(TYPE_STRING, 1, &length, sizeof(struct STRUCT_TYPE)); \
+    int el_size = sizeof(struct STRUCT_TYPE); \
+    struct STRUCT_TYPE *p = (struct STRUCT_TYPE *)BBARRAYDATA(arr, 1); \
+    int n = -beg; \
+    if (n > 0) { \
+        if (beg + n > end) n = end - beg; \
+        memset(p, 0, n * el_size); \
+        struct STRUCT_TYPE *s = p; \
+        for (k = 0; k < n; ++k) { \
+            CONSTRUCTOR_FUNC(s); \
+            s++; \
+        } \
+        p += n; \
+        beg += n; \
+        if (beg == end) return arr; \
+    } \
+    n = inarr->scales[0] - beg; \
+    if (n > 0) { \
+        if (beg + n > end) n = end - beg; \
+        memcpy(p, (struct STRUCT_TYPE *)BBARRAYDATA(inarr, inarr->dims) + beg, n * el_size); \
+        p += n; \
+        beg += n; \
+        if (beg == end) return arr; \
+    } \
+    n = end - beg; \
+    if (n > 0) { \
+        memset(p, 0, n * el_size); \
+        struct STRUCT_TYPE *s = p; \
+        for (k = 0; k < n; ++k) { \
+            CONSTRUCTOR_FUNC(s); \
+            s++; \
+        } \
+    } \
+    return arr; \
+}
+
 struct BBArray{
 	//extends BBObject
 	BBClass*        clas;
@@ -85,6 +140,8 @@ void bbArrayCopy(BBArray * srcArr, int srcPos, BBArray * dstArr, int dstPos, int
 
 int bbObjectIsEmptyArray(BBObject * o);
 
+BBArray *bbAllocateArray( const char *type,int dims,int *lens, unsigned short data_size );
+
 #ifdef __cplusplus
 }
 #endif

+ 53 - 0
blitz.mod/tests/test.bmx

@@ -24,4 +24,57 @@ Type TStringTest Extends TTest
 		Next
 	End Method
 
+	Method testToUTF8StringBuffer() { test }
+		Local s:String = "1234567890"
+		Local buf:Byte Ptr = StackAlloc(50)
+
+		Local length:size_t = 10
+		s.ToUTF8StringBuffer(buf, length)
+
+	End Method
+
 End Type
+
+Struct STestStruct
+	Field a:Int
+	Field c:Float
+	Field d:Double
+	Field b:ULong
+End Struct
+
+Type TStructArrayTest Extends TTest
+
+	Method testStructArray() { test }
+
+		Local arr:STestStruct[] = New STestStruct[10]
+		
+		For Local i:Int = 0 Until 10
+			arr[i].a = i
+			arr[i].b = i * i
+		Next
+
+		For Local i:Int = 0 Until 10
+			assertEquals(i, arr[i].a)
+			assertEquals(i * i, arr[i].b)
+		Next
+	End Method
+
+	Method testStructArraySlice() { test }
+
+		Local arr:STestStruct[] = New STestStruct[10]
+		
+		For Local i:Int = 0 Until 10
+			arr[i].a = i
+			arr[i].b = i * i
+		Next
+
+		Local slice:STestStruct[] = arr[2..5]
+
+		assertEquals(3, slice.Length)
+		assertEquals(2, slice[0].a)
+		assertEquals(3, slice[1].a)
+		assertEquals(4, slice[2].a)
+	End Method
+
+End Type
+