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