📄 utdatabaseu.c
字号:
----------------------------------------------------------------------------------------*/void utCompactDynarrayValues(void){ uint32 elementSize = sizeof(uint8); uint32 usedHeaderSize = (sizeof(utDynarray) + elementSize - 1)/elementSize; uint32 freeHeaderSize = (sizeof(utDynarray) + sizeof(uint32) + elementSize - 1)/elementSize; uint8 *toPtr = utDynarrays.Value; uint8 *fromPtr = toPtr; utDynarray Dynarray; uint32 size; while(fromPtr < utDynarrays.Value + utUsedDynarrayValue()) { Dynarray = *(utDynarray *)(void *)fromPtr; if(Dynarray != utDynarrayNull) { /* Need to move it to toPtr */ size = utMax(utDynarrayGetNumValue(Dynarray) + usedHeaderSize, freeHeaderSize); memmove((void *)toPtr, (void *)fromPtr, size*elementSize); utDynarraySetValueIndex(Dynarray, toPtr - utDynarrays.Value + usedHeaderSize); toPtr += size; } else { /* Just skip it */ size = *(uint32 *)(void *)(((utDynarray *)(void *)fromPtr) + 1); } fromPtr += size; } utSetUsedDynarrayValue(toPtr - utDynarrays.Value); utSetFreeDynarrayValue(0);}/*---------------------------------------------------------------------------------------- Allocate more memory for the Dynarray.Value heap.----------------------------------------------------------------------------------------*/static void allocMoreDynarrayValues( uint32 spaceNeeded){ uint32 freeSpace = utAllocatedDynarrayValue() - utUsedDynarrayValue(); if((utFreeDynarrayValue() << 2) > utUsedDynarrayValue()) { utCompactDynarrayValues(); freeSpace = utAllocatedDynarrayValue() - utUsedDynarrayValue(); } if(freeSpace < spaceNeeded) { utRecordResize(utModuleID, 12, utAllocatedDynarrayValue(), true); utSetAllocatedDynarrayValue(utAllocatedDynarrayValue() + spaceNeeded - freeSpace + (utAllocatedDynarrayValue() >> 2)); utResizeArray(utDynarrays.Value, utAllocatedDynarrayValue()); utRecordResize(utModuleID, 12, utAllocatedDynarrayValue(), false); }}/*---------------------------------------------------------------------------------------- Allocate memory for a new Dynarray.Value array.----------------------------------------------------------------------------------------*/void utDynarrayAllocValues( utDynarray Dynarray, uint32 numValues){ uint32 freeSpace = utAllocatedDynarrayValue() - utUsedDynarrayValue(); uint32 elementSize = sizeof(uint8); uint32 usedHeaderSize = (sizeof(utDynarray) + elementSize - 1)/elementSize; uint32 freeHeaderSize = (sizeof(utDynarray) + sizeof(uint32) + elementSize - 1)/elementSize; uint32 spaceNeeded = utMax(numValues + usedHeaderSize, freeHeaderSize);#if defined(DD_DEBUG) utAssert(utDynarrayGetNumValue(Dynarray) == 0);#endif if(numValues == 0) { return; } if(freeSpace < spaceNeeded) { allocMoreDynarrayValues(spaceNeeded); } utDynarraySetValueIndex(Dynarray, utUsedDynarrayValue() + usedHeaderSize); utDynarraySetNumValue(Dynarray, numValues); utRecordField(utModuleID, 12, utUsedDynarrayValue(), true); utRecordArray(utModuleID, 12, utDynarrayGetValueIndex(Dynarray), numValues, true); *(utDynarray *)(void *)(utDynarrays.Value + utUsedDynarrayValue()) = Dynarray; memset(utDynarrayGetValues(Dynarray), 0, numValues*elementSize); utRecordField(utModuleID, 12, utUsedDynarrayValue(), false); utRecordArray(utModuleID, 12, utDynarrayGetValueIndex(Dynarray), numValues, false); utSetUsedDynarrayValue(utUsedDynarrayValue() + spaceNeeded);}/*---------------------------------------------------------------------------------------- Wrapper around utDynarrayGetValues for the database manager.----------------------------------------------------------------------------------------*/static void *getDynarrayValues( uint64 objectNumber, uint32 *numValues){ utDynarray Dynarray = utIndex2Dynarray(objectNumber); *numValues = utDynarrayGetNumValue(Dynarray); return utDynarrayGetValues(Dynarray);}/*---------------------------------------------------------------------------------------- Wrapper around utDynarrayAllocValues for the database manager.----------------------------------------------------------------------------------------*/static void *allocDynarrayValues( uint64 objectNumber, uint32 numValues){ utDynarray Dynarray = utIndex2Dynarray(objectNumber); utDynarraySetValueIndex(Dynarray, 0); utDynarraySetNumValue(Dynarray, 0); if(numValues == 0) { return NULL; } utDynarrayAllocValues(Dynarray, numValues); return utDynarrayGetValues(Dynarray);}/*---------------------------------------------------------------------------------------- Free memory used by the Dynarray.Value array.----------------------------------------------------------------------------------------*/void utDynarrayFreeValues( utDynarray Dynarray){ uint32 elementSize = sizeof(uint8); uint32 usedHeaderSize = (sizeof(utDynarray) + elementSize - 1)/elementSize; uint32 freeHeaderSize = (sizeof(utDynarray) + sizeof(uint32) + elementSize - 1)/elementSize; uint32 size = utMax(utDynarrayGetNumValue(Dynarray) + usedHeaderSize, freeHeaderSize); uint8 *dataPtr = utDynarrayGetValues(Dynarray) - usedHeaderSize; if(utDynarrayGetNumValue(Dynarray) == 0) { return; } *(utDynarray *)(void *)(dataPtr) = utDynarrayNull; *(uint32 *)(void *)(((utDynarray *)(void *)dataPtr) + 1) = size; utDynarraySetNumValue(Dynarray, 0); utSetFreeDynarrayValue(utFreeDynarrayValue() + size);}/*---------------------------------------------------------------------------------------- Resize the Dynarray.Value array.----------------------------------------------------------------------------------------*/void utDynarrayResizeValues( utDynarray Dynarray, uint32 numValues){ uint32 freeSpace = utAllocatedDynarrayValue() - utUsedDynarrayValue(); uint32 elementSize = sizeof(uint8); uint32 usedHeaderSize = (sizeof(utDynarray) + elementSize - 1)/elementSize; uint32 freeHeaderSize = (sizeof(utDynarray) + sizeof(uint32) + elementSize - 1)/elementSize; uint32 newSize = utMax(numValues + usedHeaderSize, freeHeaderSize); uint32 oldSize = utMax(utDynarrayGetNumValue(Dynarray) + usedHeaderSize, freeHeaderSize); uint8 *dataPtr; if(numValues == 0) { if(utDynarrayGetNumValue(Dynarray) != 0) { utDynarrayFreeValues(Dynarray); }; return; } if(utDynarrayGetNumValue(Dynarray) == 0) { utDynarrayAllocValues(Dynarray, newSize); return; }; if(freeSpace < newSize) { allocMoreDynarrayValues(newSize); } dataPtr = utDynarrayGetValues(Dynarray) - usedHeaderSize; utRecordArray(utModuleID, 12, utUsedDynarrayValue(), newSize, true); utRecordArray(utModuleID, 12, dataPtr - utDynarrays.Value, freeHeaderSize, true); memcpy((void *)(utDynarrays.Value + utUsedDynarrayValue()), dataPtr, elementSize*utMin(oldSize, newSize)); if(newSize > oldSize) { memset(utDynarrays.Value + utUsedDynarrayValue() + oldSize, 0, elementSize*(newSize - oldSize)); } *(utDynarray *)(void *)dataPtr = utDynarrayNull; *(uint32 *)(void *)(((utDynarray *)(void *)dataPtr) + 1) = oldSize; utRecordArray(utModuleID, 12, utUsedDynarrayValue(), newSize, false); utRecordArray(utModuleID, 12, dataPtr - utDynarrays.Value, freeHeaderSize, false); utSetFreeDynarrayValue(utFreeDynarrayValue() + oldSize); utDynarraySetValueIndex(Dynarray, utUsedDynarrayValue() + usedHeaderSize); utDynarraySetNumValue(Dynarray, numValues); utSetUsedDynarrayValue(utUsedDynarrayValue() + newSize);}#if defined(DD_DEBUG)/*---------------------------------------------------------------------------------------- Write out all the fields of an object.----------------------------------------------------------------------------------------*/void utShowDynarray( utDynarray Dynarray){ utDatabaseShowObject("ut", "Dynarray", utDynarray2Index(Dynarray));}#endif/*---------------------------------------------------------------------------------------- Destroy SymArray including everything in it. Remove from parents.----------------------------------------------------------------------------------------*/void utSymArrayDestroy( utSymArray SymArray){ if(utSymArrayDestructorCallback != NULL) { utSymArrayDestructorCallback(SymArray); } utSymArrayFree(SymArray);}/*---------------------------------------------------------------------------------------- Default constructor wrapper for the database manager.----------------------------------------------------------------------------------------*/static uint64 allocSymArray(void){ utSymArray SymArray = utSymArrayAlloc(); return utSymArray2Index(SymArray);}/*---------------------------------------------------------------------------------------- Destructor wrapper for the database manager.----------------------------------------------------------------------------------------*/static void destroySymArray( uint64 objectIndex){ utSymArrayDestroy(utIndex2SymArray(objectIndex));}/*---------------------------------------------------------------------------------------- Allocate the field arrays of SymArray.----------------------------------------------------------------------------------------*/static void allocSymArrays(void){ utSetAllocatedSymArray(2); utSetUsedSymArray(0); utSetFirstFreeSymArray(utSymArrayNull); utSymArrays.SymIndex = utNewA(uint32, (utAllocatedSymArray())); utSymArrays.NumSym = utNewA(uint32, (utAllocatedSymArray())); utSetUsedSymArraySym(0); utSetAllocatedSymArraySym(2); utSetFreeSymArraySym(0); utSymArrays.Sym = utNewA(utSym, utAllocatedSymArraySym()); utSymArrays.UsedSym = utNewA(uint32, (utAllocatedSymArray()));}/*---------------------------------------------------------------------------------------- Realloc the arrays of properties for class SymArray.----------------------------------------------------------------------------------------*/static void reallocSymArrays( uint32 newSize){ utRecordResize(utModuleID, 16, (utAllocatedSymArray()), true); utResizeArray(utSymArrays.SymIndex, (newSize)); utRecordResize(utModuleID, 16, (newSize), false); utRecordResize(utModuleID, 17, (utAllocatedSymArray()), true); utResizeArray(utSymArrays.NumSym, (newSize)); utRecordResize(utModuleID, 17, (newSize), false); utRecordResize(utModuleID, 19, (utAllocatedSymArray()), true); utResizeArray(utSymArrays.UsedSym, (newSize)); utRecordResize(utModuleID, 19, (newSize), false); utSetAllocatedSymArray(newSize);}/*---------------------------------------------------------------------------------------- Allocate more SymArrays.----------------------------------------------------------------------------------------*/void utSymArrayAllocMore(void){ reallocSymArrays(utAllocatedSymArray() + (utAllocatedSymArray() >> 1));}/*---------------------------------------------------------------------------------------- Compact the SymArray.Sym heap to free memory.----------------------------------------------------------------------------------------*/void utCompactSymArraySyms(void){ uint32 elementSize = sizeof(utSym); uint32 usedHeaderSize = (sizeof(utSymArray) + elementSize - 1)/elementSize; uint32 freeHeaderSize = (sizeof(utSymArray) + sizeof(uint32) + elementSize - 1)/elementSize; utSym *toPtr = utSymArrays.Sym; utSym *fromPtr = toPtr; utSymArray SymArray; uint32 size; while(fromPtr < utSymArrays.Sym + utUsedSymArraySym()) { SymArray = *(utSymArray *)(void *)fromPtr; if(SymArray != utSymArrayNull) { /* Need to move it to toPtr */ size = utMax(utSymArrayGetNumSym(SymArray) + usedHeaderSize, freeHeaderSize); memmove((void *)toPtr, (void *)fromPtr, size*elementSize); utSymArraySetSymIndex(SymArray, toPtr - utSymArrays.Sym + usedHeaderSize); toPtr += size; } else { /* Just skip it */ size = *(uint32 *)(void *)(((utSymArray *)(void *)fromPtr) + 1); } fromPtr += size; } utSetUsedSymArraySym(toPtr - utSymArrays.Sym); utSetFreeSymArraySym(0);}/*---------------------------------------------------------------------------------------- Allocate more memory for the SymArray.Sym heap.----------------------------------------------------------------------------------------*/static void allocMoreSymArraySyms( uint32 spaceNeeded){ uint32 freeSpace = utAllocatedSymArraySym() - utUsedSymArraySym();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -