1 #ifndef _H_OVHeapArray 2 #define _H_OVHeapArray 3 4 #include "OVHeap.h" 5 6 typedef struct { 7 ov_size size, unit_size; 8 OVHeap *heap; 9 ov_boolean auto_zero; 10 } _OVHeapArray; 11 12 void *_OVHeapArray_Alloc(OVHeap * heap, ov_size unit_size, ov_size size, int zero 13 #ifdef OVHeap_TRACKING 14 , const char *file, int line 15 #endif 16 ); 17 18 void *_OVHeapArray_Check(void *ptr, ov_size index 19 #ifdef OVHeap_TRACKING 20 , const char *file, int line 21 #endif 22 ); 23 24 void _OVHeapArray_Free(void *ptr 25 #ifdef OVHeap_TRACKING 26 , const char *file, int line 27 #endif 28 ); 29 30 void *_OVHeapArray_SetSize(void *ptr, ov_size new_size 31 #ifdef OVHeap_TRACKING 32 , const char *file, int line 33 #endif 34 ); 35 36 ov_size OVHeapArray_GetSize(void *ptr 37 #ifdef OVHeap_TRACKING 38 , const char *file, int line 39 #endif 40 ); 41 42 43 #ifndef OVHeap_TRACKING 44 45 #define OVHeapArray_MALLOC(heap,type,size) ((type*)_OVHeapArray_Alloc(heap,sizeof(type),\ 46 size,0)) 47 #define OVHeapArray_CALLOC(heap,type,size) ((type*)_OVHeapArray_Alloc(heap,sizeof(type),\ 48 size,1)) 49 50 #define OVHeapArray_CHECK(ptr,type,index) (((index)>=(((_OVHeapArray*)(ptr))[-1].size)) ? \ 51 (((index)<((_OVHeapArray*)((ptr)=\ 52 (type*)_OVHeapArray_Check((void*)(ptr),index)))[-1].size))\ 53 : OV_TRUE) 54 55 #define OVHeapArray_SET_SIZE(ptr,type,new_size) \ 56 (((new_size)== \ 57 ((_OVHeapArray*)((ptr)= \ 58 (type*)_OVHeapArray_SetSize((void*)(ptr),(new_size))))[-1].size)) 59 60 #define OVHeapArray_GET_SIZE(ptr) OVHeapArray_GetSize((void*)ptr) 61 62 #define OVHeapArray_FREE(ptr) _OVHeapArray_Free((void*)(ptr)) 63 64 #else 65 66 #define OVHeapArray_MALLOC(heap,type,size) (type*)_OVHeapArray_Alloc(heap,sizeof(type),\ 67 size,0,\ 68 __FILE__,__LINE__) 69 #define OVHeapArray_CALLOC(heap,type,size) (type*)_OVHeapArray_Alloc(heap,sizeof(type),\ 70 size,1,\ 71 __FILE__,__LINE__) 72 73 #define OVHeapArray_CHECK(ptr,type,index) (((index)>=(((_OVHeapArray*)(ptr))[-1].size)) ? \ 74 (((index)<((_OVHeapArray*)((ptr)=\ 75 (type*)_OVHeapArray_Check((void*)(ptr),index,__FILE__,__LINE__)))[-1].size))\ 76 : OV_TRUE) 77 78 #define OVHeapArray_SET_SIZE(ptr,type,new_size) \ 79 (((new_size)== \ 80 ((_OVHeapArray*)((ptr)= \ 81 (type*)_OVHeapArray_SetSize((void*)(ptr),(new_size),__FILE__,__LINE__)))[-1].size)) 82 83 #define OVHeapArray_GET_SIZE(ptr) OVHeapArray_GetSize((void*)ptr,__FILE__,__LINE__) 84 85 #define OVHeapArray_FREE(ptr) _OVHeapArray_Free((void*)(ptr),__FILE__,__LINE__) 86 87 #endif 88 89 #define OVHeapArray_FREE_AUTO_NULL(ptr) { if(ptr) { OVHeapArray_FREE(ptr); (ptr)=OV_NULL;}} 90 91 #endif 92