Files
PlantAI-dev/tools/pymol-open-source/ov/src/OVHeapArray.cpp
T
2026-08-03 18:42:47 +08:00

167 lines
4.3 KiB
C++

#include"OVHeapArray.h"
#include"ov_utility.h"
#define OVHeapArray_COMPLAIN
#define OVHeapArray_NULL_CHECK
#ifndef OVHeap_TRACKING
#define ov_array_malloc(I,size) OVHeap_Malloc(I,size)
#define ov_array_calloc(I,num,size) OVHeap_Calloc(I,num,size)
#define ov_array_realloc(I,ptr,size) OVHeap_Realloc(I,ptr,size)
#define ov_array_free(I,ptr) OVHeap_Free(I,ptr)
#else
#define ov_array_malloc(I,size) \
_OVHeap_Malloc(I,size,file,line,OVHeap_ARRAY_TYPE)
#define ov_array_calloc(I,num,size) \
_OVHeap_Calloc(I,num,size,file,line,OVHeap_ARRAY_TYPE)
#define ov_array_realloc(I,ptr,size) \
_OVHeap_Realloc(I,ptr,size,file,line,OVHeap_ARRAY_TYPE)
#define ov_array_free(I,ptr) \
_OVHeap_Free(I,ptr,file,line,OVHeap_ARRAY_TYPE)
/* TO DO */
#endif
void *_OVHeapArray_Check(void *ptr, ov_size index
#ifdef OVHeap_TRACKING
, const char *file, int line
#endif
)
{ /* array-growth routine */
_OVHeapArray *vla = &(((_OVHeapArray *) ptr)[-1]);
if(index >= vla->size) {
ov_size new_size = (index + (index >> 1) + 1);
_OVHeapArray *new_vla;
new_vla = (_OVHeapArray *) ov_array_realloc(vla->heap, vla,
sizeof(_OVHeapArray) +
(vla->unit_size * new_size));
if(!new_vla) {
#ifdef OVHeapArray_COMPLAIN
fprintf(stderr, "_OVHeapArray_Check-Error: realloc failed\n");
#endif
} else {
vla = new_vla;
if(vla->auto_zero) {
char *start =
((char *) vla) + sizeof(_OVHeapArray) + (vla->unit_size * vla->size);
char *stop = ((char *) vla) + sizeof(_OVHeapArray) + (vla->unit_size * new_size);
ov_utility_zero_range(start, stop);
}
vla->size = new_size;
}
}
return ((void *) &(vla[1]));
}
void *_OVHeapArray_Alloc(OVHeap * heap, ov_size unit_size, ov_size size, int zero
#ifdef OVHeap_TRACKING
, const char *file, int line
#endif
)
{
_OVHeapArray *vla;
if(zero) {
vla = (_OVHeapArray *) ov_array_calloc(heap, 1, sizeof(_OVHeapArray) + (unit_size * size));
} else {
vla = (_OVHeapArray *) ov_array_malloc(heap, sizeof(_OVHeapArray) + (unit_size * size));
}
if(!vla) {
#ifdef OVHeapArray_COMPLAIN
fprintf(stderr, "_OVHeapArray: realloc failed\n");
#endif
return OV_NULL;
} else {
vla->heap = heap;
vla->size = size;
vla->unit_size = unit_size;
vla->auto_zero = zero;
return ((void *) &(vla[1]));
}
}
void _OVHeapArray_Free(void *ptr
#ifdef OVHeap_TRACKING
, const char *file, int line
#endif
)
{
_OVHeapArray *vla;
#ifdef OVHeapArray_NULL_CHECK
if(!ptr) {
#ifdef OVHeapArray_COMPLAIN
fprintf(stderr, "_OVHeapArray_Free-Error: tried to free NULL pointer!\n");
#endif
} else
#endif
{
vla = &(((_OVHeapArray *) ptr)[-1]);
ov_array_free(vla->heap, vla);
}
}
ov_size OVHeapArray_GetSize(void *ptr
#ifdef OVHeap_TRACKING
, const char *file, int line
#endif
)
{
_OVHeapArray *vla;
vla = &((_OVHeapArray *) ptr)[-1];
return (vla->size);
}
/*
void *VLANewCopy(void *ptr)
{
_OVHeapArray *vla,*new_vla;
unsigned int size;
vla = &((_OVHeapArray*)ptr)[-1];
size = (vla->unit_size*vla->size)+sizeof(_OVHeapArray);
new_vla=(void*)mmalloc(size);
if(!new_vla)
{
printf("VLACopy-ERR: mmalloc failed\n");
exit(EXIT_FAILURE);
}
else
{
memcpy(new_vla,vla,size);
}
return((void*)&(new_vla[1]));
}
*/
void *_OVHeapArray_SetSize(void *ptr, ov_size new_size
#ifdef OVHeap_TRACKING
, const char *file, int line
#endif
)
{
_OVHeapArray *vla, *new_vla;
vla = &((_OVHeapArray *) ptr)[-1];
new_vla =
(_OVHeapArray *) ov_array_realloc(vla->heap, vla,
(vla->unit_size * new_size) + sizeof(_OVHeapArray));
if(!new_vla) {
#ifdef OVHeapArray_COMPLAIN
fprintf(stderr, "VLASetSize-ERR: realloc failed.\n");
#endif
} else {
vla = new_vla;
if(new_size > vla->size && vla->auto_zero) {
char *start = ((char *) vla) + sizeof(_OVHeapArray) + (vla->unit_size * vla->size);
char *stop = ((char *) vla) + sizeof(_OVHeapArray) + (vla->unit_size * new_size);
ov_utility_zero_range(start, stop);
}
vla->size = new_size;
}
return ((void *) &(vla[1]));
}