//----------------------------------------------------------------------- // // Copyright (c) SekraSoft. All rights reserved. // //----------------------------------------------------------------------- #ifndef MCALC_ALLOC #define MCALC_ALLOC //#define ALLOC_DEBUG #define ALLOC_COUNT_BALANCE #ifdef ALLOC_COUNT_BALANCE extern long ALLOC_BALANCE; #endif /* * WARNING!! * mem_alloc может сдвинуть массивы * нельзя использовать указатели, полученные через $, $ARR до вызова mem_alloc после вызова mem_alloc * примеры: * $(a) = mem_alloc(10); // компилятор может сначала посчитать $(a), а затем mem_alloc(10) * a = mem_alloc(10); b = $(a); c = mem_alloc(20); *b = 5; // после выполнения c = mem_alloc(20) * "a" не меняется, а "$(a)" меняется. "b" хранит старое значение $(a). */ // преобразование handle -> адрес extern void **MCALC_ALLOC_obj; // преобразовать handle -> адрес #define $(handle) (MCALC_ALLOC_obj[handle]) // преобразовать handle -> переменная #define $VAR(type, handle) (*(type*)MCALC_ALLOC_obj[handle]) // преобразовать handle -> массив #define $ARR(type, handle) ((type*)MCALC_ALLOC_obj[handle]) #define $LOCK {mem_locked=1;} #define $UNLOCK {mem_locked=0;} #define $LOCKED mem_locked #define $NEW(size) (mem_alloc(size)) #define $DEL(handle) (mem_free(handle)) #define $H(pointer) (mem_assign(pointer)) #define $R(handle) (mem_release(handle)) #define hstrcpy(dest,source) strcpy($(dest),$(source)) #define hstrncpy(dest,source,count) strncpy($(dest),$(source),count) #define hstrcmp(str1,str2) strcmp($(str1),$(str2)) #define hstrncmp(str1,str2,count) strncmp($(str1),$(str2),count) #define hstrlen(str) strlen($(str)) #define hmemmove(dest,source,count) memmove($(dest),$(source),count) #define hmemcpy(dest,source,count) memcpy($(dest),$(source),count) // запретить/разрешить сдвиг кусков памяти (указатель не изменится) extern int mem_locked; // настроить хранилище переменных (возвращает 1 в случае успеха или 0 иначе) extern int mem_init(size_t obj_maxcount, size_t mem_maxcount); // удалить хранилище переменных extern void mem_deinit(); // оптимально переформировать хранилище переменных (возвращает 1 в случае успеха или 0 иначе) extern int mem_recycle(size_t i_want); // насильно переформировать хранилище переменных (возвращает 1 в случае успеха или 0 иначе) extern int mem_optimize(); // выделить память (возвращает handle или 0 в случае неудачи) extern size_t mem_alloc(size_t vsize); // перевыделить память для переменной (возвращает 1 в случае успеха или 0 иначе) extern int mem_realloc(size_t handle, size_t vsize); // освободить память extern size_t mem_free(size_t handle); // назначить handle для стороннего указателя extern size_t mem_assign(void*pointer); // переназначить handle для стороннего указателя void mem_reassign(size_t handle, void*pointer); // освободить handle, которому был назначен сторонний указатель void mem_release(size_t handle); /* * WARNING!! * alloc, realloc, free - одна группа операций * assign, reassign, release - другая группа операций * их нельзя использовать вперемешку */ #endif