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