archeus/src/std/handler.c

79 lines
2 KiB
C
Raw Normal View History

2022-10-27 15:16:54 -06:00
#include "arc/std/handler.h"
#include "arc/std/errno.h"
#include "arc/std/vector.h"
#include <stdlib.h>
struct ARC_Handler {
ARC_Vector *data;
ARC_Vector *trash;
ARC_Handler_CleanDataFn cleanfn;
2022-10-27 15:16:54 -06:00
};
void ARC_Handler_Create(ARC_Handler **handler, ARC_Handler_CompareDataFn *compareFn, ARC_Handler_CleanDataFn cleanfn){
2022-10-27 15:16:54 -06:00
*handler = (ARC_Handler *) malloc(sizeof(ARC_Handler));
ARC_Vector_Create(&((*handler)->data), NULL, NULL);
ARC_Vector_Create(&((*handler)->trash), compareFn, NULL);
(*handler)->cleanfn = cleanfn;
2022-10-27 15:16:54 -06:00
}
void ARC_Handler_Destroy(ARC_Handler *handler){
2022-10-27 15:16:54 -06:00
ARC_Handler_Clear(handler);
ARC_Handler_Clean(handler);
2022-10-27 15:16:54 -06:00
ARC_Vector_Destroy(handler->data);
ARC_Vector_Destroy(handler->trash);
free(handler);
}
void ARC_Handler_Add(ARC_Handler *handler, void *data){
ARC_Vector_Add(handler->data, data);
}
void ARC_Handler_Remove(ARC_Handler *handler, void *data){
2022-11-11 01:15:33 -07:00
ARC_Vector_Add(handler->trash, data);
ARC_Vector_Remove(handler->data, data);
2022-10-27 15:16:54 -06:00
}
void ARC_Handler_RemoveIndex(ARC_Handler *handler, uint32_t index){
if(ARC_Vector_GetSize(handler->data) == 0){
return;
}
2022-10-27 15:16:54 -06:00
void *data = ARC_Vector_Get(handler->data, index);
ARC_Vector_Add(handler->trash, data);
2022-11-11 01:15:33 -07:00
ARC_Vector_RemoveIndex(handler->data, index);
2022-10-27 15:16:54 -06:00
}
void ARC_Handler_Iterate(ARC_Handler *handler, ARC_Handler_DataFn datafn){
for(uint32_t i = 0; i < ARC_Vector_GetSize(handler->data); i++){
datafn(ARC_Vector_Get(handler->data, i));
2022-10-27 15:16:54 -06:00
}
}
void ARC_Handler_Clear(ARC_Handler *handler){
2022-11-11 01:15:33 -07:00
uint32_t zeroIndex = 0;
while(ARC_Vector_GetSize(handler->data)){
ARC_Handler_RemoveIndex(handler, zeroIndex);
2022-10-27 15:16:54 -06:00
}
}
void ARC_Handler_Clean(ARC_Handler *handler){
2022-10-27 15:16:54 -06:00
uint32_t i = 0;
while(ARC_Vector_GetSize(handler->trash)){
void *data = ARC_Vector_Get(handler->trash, i);
2022-11-11 01:15:33 -07:00
if(handler->cleanfn){
handler->cleanfn(data);
2022-11-11 01:15:33 -07:00
}
ARC_Vector_RemoveIndex(handler->trash, i);
2022-10-27 15:16:54 -06:00
}
}
uint32_t ARC_Handler_GetSize(ARC_Handler *handler){
return ARC_Vector_GetSize(handler->data);
2022-10-27 15:16:54 -06:00
}