# HG changeset patch # User Nina Engelhardt # Date 1324311082 -3600 # Node ID fd441e4d0908805d56cae21e396b5ca9fc49d74c # Parent bc4b3434367ff81a0048bab0be8ea0386fedc4ac bugfix diff -r bc4b3434367f -r fd441e4d0908 ListOfArrays.c --- a/ListOfArrays.c Mon Dec 19 13:25:30 2011 +0100 +++ b/ListOfArrays.c Mon Dec 19 17:11:22 2011 +0100 @@ -15,17 +15,19 @@ void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr){ ArrayFragment* current = list->first; - while(current->next){ - uintptr_t p; - for(p = current->data; p < current->data + list->num_entries_per_fragment * list->entry_size; p += list->entry_size){ - (*fnPtr)(p); + int num_full_blocks = (list->next_free_index / list->num_entries_per_fragment); + uintptr_t p; + while(num_full_blocks > 0){ + for(p = (uintptr_t)&(current->data); p < (uintptr_t) &(current->data) + list->num_entries_per_fragment * list->entry_size; p += list->entry_size){ + (*fnPtr)((void*)p); } - current = current->next; + current = (ArrayFragment*) current->next; + num_full_blocks--; } //assert(current == list->last); int offset_in_last = list->next_free_index % list->num_entries_per_fragment; - uintptr_t p; - for(p = current->data; p < current->data + offset_in_last * list->entry_size; p += list->entry_size){ - (*fnPtr)(p); + + for(p = (uintptr_t)&(current->data); p < (uintptr_t)&(current->data) + offset_in_last * list->entry_size; p += list->entry_size){ + (*fnPtr)((void*)p); } } \ No newline at end of file diff -r bc4b3434367f -r fd441e4d0908 ListOfArrays.h --- a/ListOfArrays.h Mon Dec 19 13:25:30 2011 +0100 +++ b/ListOfArrays.h Mon Dec 19 17:11:22 2011 +0100 @@ -8,8 +8,10 @@ #ifndef LISTOFARRAYS_H #define LISTOFARRAYS_H +#include + typedef struct { - ArrayFragment* next; + void* next; void* data; } ArrayFragment; @@ -21,6 +23,8 @@ int next_free_index; } ListOfArrays; +ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block); + #define addToListOfArrays(type,value,list) do { \ int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \ if(offset_in_fragment == 0){ \ @@ -34,11 +38,18 @@ } \ list->last = newBlock; \ } \ - (type*) typedFragment = (type*) list->last->data; \ + type* typedFragment = (type*) &(list->last->data); \ typedFragment[offset_in_fragment] = value; \ + list->next_free_index++; \ } while (0) typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void * +void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr); + +#define getValuefromListOfArrays(type,index,list) + +#define setValueInListOfArrays(type,index,value,list) + #endif /* LISTOFARRAYS_H */