9#include <Library/BaseMemoryLib.h>
10#include <Library/BaseOverflowLib.h>
11#include <Library/MemoryAllocationLib.h>
15#define INITIAL_NUM_ITEMS (8)
24 if (*(VOID **)Item != NULL) {
25 FreePool (*(VOID **)Item);
26 *(VOID **)Item = NULL;
32 IN CONST UINTN ItemSize,
41 if (FlexArray != NULL) {
46 DEBUG ((
OC_TRACE_FLEX,
"FLEX: Init %p %u\n", FlexArray, ItemSize));
68 ASSERT (FlexArray != NULL);
69 ASSERT (Index < FlexArray->Count);
70 ASSERT (FlexArray->Items != NULL);
72 Item = ((UINT8 *)FlexArray->Items) + Index * FlexArray->ItemSize;
94 ASSERT (FlexArray != NULL);
96 if (FlexArray->Items == NULL) {
98 if (BaseOverflowMulUN (FlexArray->AllocatedCount, FlexArray->ItemSize, &NewSize)) {
102 FlexArray->Count = 1;
103 FlexArray->Items = AllocatePool (NewSize);
104 if (FlexArray->Items == NULL) {
108 ASSERT (FlexArray->AllocatedCount > 0);
109 ASSERT (FlexArray->Count <= FlexArray->AllocatedCount);
110 ++(FlexArray->Count);
111 if (FlexArray->Count > FlexArray->AllocatedCount) {
112 if (BaseOverflowMulUN (FlexArray->AllocatedCount * FlexArray->ItemSize, 2, &NewSize)) {
116 TmpBuffer = ReallocatePool (
117 FlexArray->AllocatedCount * FlexArray->ItemSize,
121 if (TmpBuffer == NULL) {
125 FlexArray->Items = TmpBuffer;
126 FlexArray->AllocatedCount = FlexArray->AllocatedCount * 2;
142 ASSERT (FlexArray != NULL);
147 ZeroMem (Item, FlexArray->ItemSize);
150 DEBUG ((
OC_TRACE_FLEX,
"FLEX: Add %p %p\n", FlexArray, Item));
158 IN CONST UINTN InsertIndex
164 ASSERT (FlexArray != NULL);
165 ASSERT (InsertIndex <= FlexArray->Count);
167 if (InsertIndex == FlexArray->Count) {
179 CopyMem (Dest, Item, (FlexArray->Count - InsertIndex) * FlexArray->ItemSize);
181 ZeroMem (Item, FlexArray->ItemSize);
183 DEBUG ((
OC_TRACE_FLEX,
"FLEX: Insert %p %p\n", FlexArray, Item));
199 ASSERT (FlexArray != NULL);
200 ASSERT (Index < FlexArray->Count);
201 ASSERT (FlexArray->Items != NULL);
205 DEBUG ((
OC_TRACE_FLEX,
"FLEX: At %p %p\n", FlexArray, Item));
219 ASSERT (FlexArray != NULL);
221 if (*FlexArray != NULL) {
222 if ((*FlexArray)->Items != NULL) {
223 if ((*FlexArray)->FreeItem != NULL) {
224 for (Index = 0; Index < (*FlexArray)->Count; Index++) {
229 FreePool ((*FlexArray)->Items);
232 FreePool (*FlexArray);
240 IN CONST BOOLEAN FreeItem
243 DEBUG ((
OC_TRACE_FLEX,
"FLEX: Discard %p %u\n", FlexArray, FreeItem));
245 ASSERT (FlexArray != NULL);
246 ASSERT (FlexArray->Items != NULL);
247 ASSERT (FlexArray->Count > 0);
249 if (FreeItem && (FlexArray->FreeItem != NULL)) {
263 DEBUG ((
OC_TRACE_FLEX,
"FLEX: FreeContainer %p\n", FlexArray));
265 if ((FlexArray == NULL) || (*FlexArray == NULL)) {
270 *Items = (*FlexArray)->Items;
271 *Count = (*FlexArray)->Count;
272 if ((*Count == 0) && (*Items != NULL)) {
277 FreePool (*FlexArray);
VOID * OcFlexArrayInsertItem(IN OUT OC_FLEX_ARRAY *FlexArray, IN CONST UINTN InsertIndex)
STATIC VOID * InternalFlexArrayItemAt(IN CONST OC_FLEX_ARRAY *FlexArray, IN CONST UINTN Index)
OC_FLEX_ARRAY * OcFlexArrayInit(IN CONST UINTN ItemSize, IN CONST OC_FLEX_ARRAY_FREE_ITEM FreeItem OPTIONAL)
VOID OcFlexArrayFreePointerItem(IN VOID *Item)
STATIC VOID * InternalFlexArrayAddItem(IN OUT OC_FLEX_ARRAY *FlexArray)
VOID * OcFlexArrayAddItem(IN OUT OC_FLEX_ARRAY *FlexArray)
VOID * OcFlexArrayItemAt(IN CONST OC_FLEX_ARRAY *FlexArray, IN CONST UINTN Index)
VOID OcFlexArrayDiscardItem(IN OUT OC_FLEX_ARRAY *FlexArray, IN CONST BOOLEAN FreeItem)
VOID OcFlexArrayFree(IN OC_FLEX_ARRAY **FlexArray)
VOID OcFlexArrayFreeContainer(IN OC_FLEX_ARRAY **FlexArray, IN VOID **Items, IN UINTN *Count)
#define INITIAL_NUM_ITEMS
VOID(* OC_FLEX_ARRAY_FREE_ITEM)(IN VOID *Item)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
OC_FLEX_ARRAY_FREE_ITEM FreeItem