seanhalle@17: /* seanhalle@17: * File: ListOfArrays.h seanhalle@17: * Author: Nina Engelhardt seanhalle@17: * seanhalle@17: * Created on December 16, 2011, 2:06 PM seanhalle@17: */ seanhalle@17: seanhalle@17: #ifndef _LISTOFARRAYS_H seanhalle@17: #define _LISTOFARRAYS_H seanhalle@17: seanhalle@17: #include seanhalle@17: #include seanhalle@17: seanhalle@17: #include seanhalle@17: #include seanhalle@17: seanhalle@17: seanhalle@17: typedef struct { seanhalle@17: void* next; seanhalle@17: void* data; seanhalle@17: } ArrayFragment; seanhalle@17: seanhalle@17: typedef struct { seanhalle@17: void** dim1; seanhalle@17: PrivDynArrayInfo* dim1info; seanhalle@17: //ArrayFragment* last; seanhalle@17: size_t entry_size; seanhalle@17: int num_entries_per_fragment; seanhalle@17: int next_free_index; seanhalle@17: } ListOfArrays; seanhalle@17: seanhalle@17: ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block); seanhalle@17: seanhalle@17: #define addToListOfArrays(type,value,list) do { \ seanhalle@17: int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \ seanhalle@17: if(offset_in_fragment == 0){ \ seanhalle@17: void* newBlock = PR__malloc(list->entry_size * list->num_entries_per_fragment); \ seanhalle@17: addToDynArray(newBlock,list->dim1info); \ seanhalle@17: } \ seanhalle@17: type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \ seanhalle@17: typedFragment[offset_in_fragment] = value; \ seanhalle@17: list->next_free_index++; \ seanhalle@17: } while (0) seanhalle@17: seanhalle@17: #define addToListOfArrays_ext(type,value,list) do { \ seanhalle@17: int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \ seanhalle@17: if(offset_in_fragment == 0){ \ seanhalle@17: void* newBlock = malloc(list->entry_size * list->num_entries_per_fragment); \ seanhalle@17: addToDynArray(newBlock,list->dim1info); \ seanhalle@17: } \ seanhalle@17: type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \ seanhalle@17: typedFragment[offset_in_fragment] = value; \ seanhalle@17: list->next_free_index++; \ seanhalle@17: } while (0) seanhalle@17: seanhalle@17: typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void * seanhalle@17: seanhalle@17: void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr); seanhalle@17: seanhalle@17: #define valueInListOfArrays(type,index,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] seanhalle@17: seanhalle@17: #define setValueInListOfArrays(type,index,value,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] = value seanhalle@17: seanhalle@17: void freeListOfArrays(ListOfArrays* list); seanhalle@17: seanhalle@17: #endif /* LISTOFARRAYS_H */ seanhalle@17: