Array.c (1454B)
1 #include <EGong/Util/Array.h> 2 #include <EGong/Util/Log.h> 3 #include <EGong/Util/SAlloc.h> 4 #include <stdint.h> 5 #include <string.h> 6 7 void Array_init(struct Array *array, size_t element_size, size_t chunks){ 8 if(chunks==0)chunks=10; 9 SAlloc_init(&array->memory, element_size*chunks); 10 array->element_size=element_size; 11 array->element_count=0; 12 } 13 14 int Array_add(struct Array *array, void *element){ 15 void *ptr=SAlloc_alloc(&array->memory, array->element_size); 16 memcpy(ptr, element, array->element_size); 17 array->element_count++; 18 } 19 void *Array_get(struct Array *array, unsigned int id){ 20 if(id>array->element_count-1){ 21 do_log("Element out of boundary", LOG_TYPE_NORMAL, LOG_LEVEL_ERROR); 22 return NULL; 23 } 24 return (void *)((intptr_t)array->memory.data+(uintptr_t)(id*array->element_size)); 25 } 26 int Array_delete(struct Array *array, unsigned int id){ 27 if(id>array->element_count-1){ 28 do_log("Element out of boundary", LOG_TYPE_NORMAL, LOG_LEVEL_ERROR); 29 return -1; 30 } 31 else{ 32 if(id<array->element_count-1){ 33 void *ptr=Array_get(array, id); 34 memcpy(ptr, ptr+array->element_size, array->element_size*(array->element_count-id)); 35 } 36 SAlloc_rewind(&array->memory, array->element_size); 37 } 38 array->element_count--; 39 return 0; 40 } 41 42 void Array_foreach(struct Array *array, void(*func)(void*)){ 43 unsigned int i; 44 for(i=0; i<array->element_count; i++){ 45 func(Array_get(array,i)); 46 } 47 } 48 void Array_destroy(struct Array *array){ 49 SAlloc_destroy(&array->memory); 50 }