blitz_array.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #ifndef BLITZ_ARRAY_H
  2. #define BLITZ_ARRAY_H
  3. #include "blitz_types.h"
  4. #ifdef __cplusplus
  5. extern "C"{
  6. #endif
  7. #define BBNULLARRAY (&bbEmptyArray)
  8. #define BBARRAYSIZE(q,n) (((offsetof(BBArray, scales) + n * sizeof(int)+0x0f) & ~0x0f)+(q))
  9. //#define BBARRAYDATA(p,n) ((void*)((char*)(p)+((offsetof(BBArray, scales) + n * sizeof(int)+0x0f) & ~0x0f)))
  10. #define BBARRAYDATA(p,n) ((void*)((char*)(p)+((BBArray*)(p))->data_start))
  11. #define BBARRAYDATAINDEX(p,n,i) bbArrayIndex(p,n,i)
  12. #define BBARRAYNEW1DSTRUCT_FUNC(FUNC_SUFFIX, STRUCT_TYPE, CONSTRUCTOR_FUNC, TYPE_STRING) \
  13. BBArray *bbArrayNew1DStruct_##FUNC_SUFFIX(int length) { \
  14. BBArray *arr = bbAllocateArray(TYPE_STRING, 1, &length, sizeof(struct STRUCT_TYPE)); \
  15. if (!arr->size) return arr; \
  16. struct STRUCT_TYPE *p = (struct STRUCT_TYPE *)(BBARRAYDATA(arr, arr->dims)); \
  17. memset(p, 0, arr->size); \
  18. struct STRUCT_TYPE *s = p; \
  19. for (int k = arr->scales[0]; k > 0; --k) { \
  20. CONSTRUCTOR_FUNC(s); \
  21. s++; \
  22. } \
  23. return arr; \
  24. }
  25. #define BBARRAYSLICESTRUCT_FUNC(FUNC_SUFFIX, STRUCT_TYPE, CONSTRUCTOR_FUNC, TYPE_STRING) \
  26. BBArray *bbArraySliceStruct_##FUNC_SUFFIX(BBArray *inarr, int beg, int end) { \
  27. int k; \
  28. int length = end - beg; \
  29. if (length <= 0) return &bbEmptyArray; \
  30. BBArray *arr = bbAllocateArray(TYPE_STRING, 1, &length, sizeof(struct STRUCT_TYPE)); \
  31. int el_size = sizeof(struct STRUCT_TYPE); \
  32. struct STRUCT_TYPE *p = (struct STRUCT_TYPE *)BBARRAYDATA(arr, 1); \
  33. int n = -beg; \
  34. if (n > 0) { \
  35. if (beg + n > end) n = end - beg; \
  36. memset(p, 0, n * el_size); \
  37. struct STRUCT_TYPE *s = p; \
  38. for (k = 0; k < n; ++k) { \
  39. CONSTRUCTOR_FUNC(s); \
  40. s++; \
  41. } \
  42. p += n; \
  43. beg += n; \
  44. if (beg == end) return arr; \
  45. } \
  46. n = inarr->scales[0] - beg; \
  47. if (n > 0) { \
  48. if (beg + n > end) n = end - beg; \
  49. memcpy(p, (struct STRUCT_TYPE *)BBARRAYDATA(inarr, inarr->dims) + beg, n * el_size); \
  50. p += n; \
  51. beg += n; \
  52. if (beg == end) return arr; \
  53. } \
  54. n = end - beg; \
  55. if (n > 0) { \
  56. memset(p, 0, n * el_size); \
  57. struct STRUCT_TYPE *s = p; \
  58. for (k = 0; k < n; ++k) { \
  59. CONSTRUCTOR_FUNC(s); \
  60. s++; \
  61. } \
  62. } \
  63. return arr; \
  64. }
  65. struct BBArray{
  66. //extends BBObject
  67. BBClass* clas;
  68. const char* type; //
  69. unsigned int dims; //
  70. unsigned int size; // total size minus this header
  71. unsigned short data_size; // size of data element
  72. unsigned short data_start; // start offset of data
  73. int scales[1]; // [dims]
  74. };
  75. struct BBClass_Array{
  76. //extends BBGCPool
  77. BBClass* super;
  78. void (*free)( BBObject *o );
  79. BBDebugScope*debug_scope;
  80. unsigned int instance_size;
  81. void (*ctor)( BBObject *o );
  82. void (*dtor)( BBObject *o );
  83. BBString* (*ToString)( BBObject *x );
  84. int (*Compare)( BBObject *x,BBObject *y );
  85. BBObject* (*SendMessage)( BBObject * o, BBObject *m,BBObject *s );
  86. BBINTERFACETABLE itable;
  87. void* extra;
  88. unsigned int obj_size;
  89. unsigned int instance_count;
  90. unsigned int fields_offset;
  91. void (*bbArraySort)( BBArray *arr,int ascending );
  92. BBArray* (*bbArrayDimensions)( BBArray *arr );
  93. };
  94. extern struct BBClass_Array bbArrayClass;
  95. extern BBArray bbEmptyArray;
  96. BBArray* bbArrayNew( const char *type,int dims,... );
  97. BBArray* bbArrayNew1D( const char *type,int length );
  98. BBArray* bbArrayNewEx( const char *type,int dims,int *lens ); //alternate version of New...
  99. BBArray* bbArraySlice( const char *type,BBArray *arr,int beg,int end );
  100. BBArray* bbArrayFromData( const char *type,int length,void *data );
  101. BBArray* bbArrayCastFromObject( BBObject *o,const char *type_encoding );
  102. void bbArraySort( BBArray *arr,int ascending );
  103. BBArray* bbArrayDimensions( BBArray *arr );
  104. BBArray* bbArrayConcat( const char *type,BBArray *x,BBArray *y );
  105. void* bbArrayIndex( BBArray *, int, int );
  106. typedef void (*BBArrayStructInit)(void * ref);
  107. BBArray* bbArrayNew1DStruct( const char *type,int length, unsigned short data_size, BBArrayStructInit init );
  108. BBArray* bbArrayNewStruct( const char *type,unsigned short data_size, BBArrayStructInit init, int dims, ... );
  109. BBArray* bbArrayFromDataStruct( const char *type,int length,void *data, unsigned short data_size );
  110. BBArray* bbArraySliceStruct( const char *type,BBArray *inarr,int beg,int end, unsigned short data_size, BBArrayStructInit structInit );
  111. BBArray* bbArrayFromDataSize( const char *type,int length,void *data, unsigned short data_size );
  112. BBArray* bbArrayNew1DNoInit( const char *type,int length );
  113. void bbArrayCopy(BBArray * srcArr, int srcPos, BBArray * dstArr, int dstPos, int length);
  114. int bbObjectIsEmptyArray(BBObject * o);
  115. BBArray *bbAllocateArray( const char *type,int dims,int *lens, unsigned short data_size );
  116. #ifdef __cplusplus
  117. }
  118. #endif
  119. #endif