/
vTech
/
FcApps
Обзор
Документация
Войти
/
vTech
/
FcApps
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
FcLibs/FcUI/src/FcUI_Algo/FcUI_Array.h
126 строк
5 KB
vTech
alpha_00
03 дек 2025, 17:45
03 дек 2025, 17:45
ab8382d
Код
Авторство
О чём код?
#ifndef _FCUI_ARRAY_H_ #define _FCUI_ARRAY_H_ #include "FcUI_Setting.h" #include "FcUI_Memory.h" #include "FcUI_Error.h" #define FcUI_Array(n) \ typedef struct _FcUI_Array_##n##_t { \ size_t mSize; \ size_t mOffsetData[n]; \ size_t mSizeData[n]; \ size_t mSizeBlock[n]; \ FcUI_Memory_t* mMemory; \ }FcUI_Array_##n##_t; \ FCUIDEF FcUI_Error_t FcUI_Array_##n(FcUI_Array_##n##_t* pArray, size_t pSizeBlock[n]){\ size_t i, j, l; \ FcUI_Error_t mError; \ uint8_t mData; \ mError = FCUI_ERROR_NOERROR; \ if (!pArray || \ !pSizeBlock) { \ mError = FCUI_ERROR_PARAMETERS; \ goto gError; \ } \ mData = 0; \ j = 0; \ for (i = 0; i < n; i++) { \ pArray->mOffsetData[i] = pSizeBlock[i] * i; \ pArray->mSizeBlock[i] = pSizeBlock[i]; \ pArray->mSizeData[i] = 0; \ } \ \ for (j = l = 0; j < 2; l += pArray->mSizeBlock[j], j++); \ pArray->mSize = l; \ mError = FcUI_Memory(&pArray->mMemory, l, l); \ if (mError) goto gError; \ for (i = 0; i < l; i++) { \ mError = FcUI_Memory_setData(pArray->mMemory, i, &mData, 1); \ if (mError) goto gError; \ } \ gError: \ return mError; \ } \ FCUIDEF FcUI_Error_t FcUI_Array_add_##n(FcUI_Array_##n##_t* pArray, uint8_t* pData) { \ size_t j, i, l; \ uint8_t mData; \ FcUI_Error_t mError = FCUI_ERROR_NOERROR; \ if (!pArray || \ !pData) { \ mError = FCUI_ERROR_PARAMETERS; \ goto gError; \ } \ mData = 0; \ for (j = l = 0; j < n; l += pArray->mSizeBlock[j], j++); \ mError = FcUI_Memory(&pArray->mMemory, pArray->mSize + l, l); \ if (mError) goto gError; \ for (j = l = 0; j < n; j++){ \ pArray->mSizeData[j] += l; \ mError = FcUI_Memory_setData(pArray->mMemory, pArray->mOffsetData[j], pData + l, pArray->mSizeBlock[j]);\ l += pArray->mSizeBlock[j]; \ if (mError) goto gError; \ } \ for (j = 0; j < n; j++) \ for (i = 0; i < l; i++) { \ mError = FcUI_Memory_setData(pArray->mMemory, pArray->mOffsetData[0] + l + j * l + i, &mData, 1); \ if (mError) goto gError; \ } \ for (j = 0; j < n; j++) { \ pArray->mOffsetData[j] += l; \ } \ pArray->mSize += l; \ gError: \ return mError; \ } \ FCUIDEF uint8_t* FcUI_Array_get_##n##_i(FcUI_Array_##n##_t* pArray, size_t id, size_t i){ \ uint8_t* mData = (uint8_t*)0; \ if (!pArray || (n <= id)) \ return mData; \ mData = FcUI_Memory_getData(pArray->mMemory, \ i * pArray->mSizeBlock[id], \ pArray->mSizeBlock[id]); \ return mData; \ } \ FCUIDEF FcUI_Error_t FcUI_Array_##n##_free(FcUI_Array_##n##_t* pArray){ \ FcUI_Error_t mError; \ mError = FCUI_ERROR_NOERROR; \ if (!pArray) { \ mError = FCUI_ERROR_PARAMETERS; \ goto gError; \ } \ mError = FcUI_Memory_free(&pArray->mMemory); \ if (mError) goto gError; \ memset(pArray, 0, sizeof(*pArray)); \ gError: \ return mError; \ } \ FCUIDEF FcUI_Error_t FcUI_Array_add_##n##_i(FcUI_Array_##n##_t* pArray, size_t id, uint8_t* pData) { \ bool mAllocMemory; \ size_t j, i, l; \ uint8_t mData; \ FcUI_Error_t mError = FCUI_ERROR_NOERROR; \ FCUISAFECALL(mError, (pArray && (id <= n) && pData), FCUI_ERROR_PARAMETERS); \ mData = 0; \ for (j = l = 0; j < n; l += pArray->mSizeBlock[j], j++); \ mAllocMemory = pArray->mOffsetData[id] + n * l > pArray->mMemory->mSize; \ if (mAllocMemory) \ FCUISAFECALLF(mError, FcUI_Memory(&pArray->mMemory, pArray->mSize + l, l)); \ FCUISAFECALLF(mError, FcUI_Memory_setData(pArray->mMemory, pArray->mOffsetData[id], pData, pArray->mSizeBlock[id]));\ if (mAllocMemory) \ for (i = 0; i < l; i++) { \ FCUISAFECALLF(mError, FcUI_Memory_setData(pArray->mMemory, pArray->mOffsetData[id] + l + i, &mData, 1)); \ } \ pArray->mOffsetData[id] += l; \ pArray->mSizeData[id] += l; \ pArray->mSize += mAllocMemory ? l : 0; \ gError: \ return mError; \ } FcUI_Array(1) FcUI_Array(2) FcUI_Array(3) FcUI_Array(4) #endif //_FCUI_ARRAY_H_