EGong

git clone git://xatko.vsos.ethz.ch/EGong.git
Log | Files | Refs

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 }