# HG changeset patch # User Nina Engelhardt # Date 1324403577 -3600 # Node ID ef1712d6d7d8374aa899135c23c25a7917e74854 # Parent fd441e4d0908805d56cae21e396b5ca9fc49d74c change internal structure from list to dynarray diff -r fd441e4d0908 -r ef1712d6d7d8 ListOfArrays.c --- a/ListOfArrays.c Mon Dec 19 17:11:22 2011 +0100 +++ b/ListOfArrays.c Tue Dec 20 18:52:57 2011 +0100 @@ -4,8 +4,9 @@ ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block){ ListOfArrays* newLoA = (ListOfArrays*) VMS__malloc(sizeof(ListOfArrays)); - newLoA->first = NULL; - newLoA->last = NULL; + newLoA->dim1info = makePrivDynArrayOfSize(&(newLoA->dim1),8); + + newLoA->entry_size = entry_size; newLoA->num_entries_per_fragment = num_entries_per_block; newLoA->next_free_index = 0; @@ -14,20 +15,42 @@ } void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr){ - ArrayFragment* current = list->first; - int num_full_blocks = (list->next_free_index / list->num_entries_per_fragment); + int n; 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){ + for(n=0;ndim1info->numInArray -1; n++){ + for(p = (uintptr_t) (list->dim1)[n]; p < (uintptr_t) (list->dim1)[n] + list->num_entries_per_fragment * list->entry_size; p += list->entry_size){ (*fnPtr)((void*)p); } - current = (ArrayFragment*) current->next; - num_full_blocks--; } - //assert(current == list->last); int offset_in_last = list->next_free_index % list->num_entries_per_fragment; + n = list->dim1info->numInArray - 1; + if (n >= 0){ + for(p = (uintptr_t)(list->dim1)[n]; p < (uintptr_t)(list->dim1)[n] + offset_in_last * list->entry_size; p += list->entry_size){ + (*fnPtr)((void*)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 +/* +void addToListOfArraysDependency(Dependency value, ListOfArrays* list){ + int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; + if(offset_in_fragment == 0){ + void* newBlock = VMS__malloc(list->entry_size * list->num_entries_per_fragment); + addToDynArray(newBlock,list->dim1info); + } + Dependency* typedFragment = (Dependency*) ((list->dim1)[list->dim1info->numInArray -1]); + typedFragment[offset_in_fragment] = value; + list->next_free_index++; +} + +void addToListOfArraysUnit(Unit value, ListOfArrays* list){ + int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; + if(offset_in_fragment == 0){ + void* newBlock = VMS__malloc(list->entry_size * list->num_entries_per_fragment); + addToDynArray(newBlock,list->dim1info); + } + Unit* typedFragment = (Unit*) ((list->dim1)[list->dim1info->numInArray -1]); + typedFragment[offset_in_fragment] = value; + list->next_free_index++; +} + */ \ No newline at end of file diff -r fd441e4d0908 -r ef1712d6d7d8 ListOfArrays.h --- a/ListOfArrays.h Mon Dec 19 17:11:22 2011 +0100 +++ b/ListOfArrays.h Tue Dec 20 18:52:57 2011 +0100 @@ -9,6 +9,9 @@ #define LISTOFARRAYS_H #include +#include "../DynArray/DynArray.h" +#include "../../dependency.h" + typedef struct { void* next; @@ -16,8 +19,9 @@ } ArrayFragment; typedef struct { - ArrayFragment* first; - ArrayFragment* last; + void** dim1; + PrivDynArrayInfo* dim1info; + //ArrayFragment* last; size_t entry_size; int num_entries_per_fragment; int next_free_index; @@ -28,21 +32,17 @@ #define addToListOfArrays(type,value,list) do { \ int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \ if(offset_in_fragment == 0){ \ - ArrayFragment* newBlock = (ArrayFragment*) VMS__malloc(sizeof(ArrayFragment*) + list->entry_size * list->num_entries_per_fragment); \ - newBlock->next == NULL; \ - if(list->first == NULL) {\ - list->first = newBlock; \ - } \ - if(list->last != NULL) { \ - list->last->next = newBlock; \ - } \ - list->last = newBlock; \ + void* newBlock = VMS__malloc(list->entry_size * list->num_entries_per_fragment); \ + addToDynArray(newBlock,list->dim1info); \ } \ - type* typedFragment = (type*) &(list->last->data); \ + type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \ typedFragment[offset_in_fragment] = value; \ list->next_free_index++; \ } while (0) +//void addToListOfArraysDependency(Dependency value, ListOfArrays* list); +//void addToListOfArraysUnit(Unit value, ListOfArrays* list); + typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void * void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr);