# HG changeset patch # User Nina Engelhardt # Date 1346430446 -7200 # Node ID abf2117d753533e6787b0487e0f10f43de27f514 # Parent 5df9392eca1a7795f2dd0addd2c89fd423bf15ed make lists clearable diff -r 5df9392eca1a -r abf2117d7535 ListOfArrays.c --- a/ListOfArrays.c Tue Mar 13 18:31:06 2012 -0700 +++ b/ListOfArrays.c Fri Aug 31 18:27:26 2012 +0200 @@ -16,21 +16,24 @@ void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr){ int n; uintptr_t p; - int num_full = list->next_free_index / list->num_entries_per_fragment; //list->dim1info->numInArray -1 + int num_full = list->next_free_index / list->num_entries_per_fragment; //!\\ != list->dim1info->numInArray-1 for(n=0;ndim1)[n]; p < (uintptr_t) (list->dim1)[n] + list->num_entries_per_fragment * list->entry_size; p += list->entry_size){ (*fnPtr)((void*)p); } } int offset_in_last = list->next_free_index % list->num_entries_per_fragment; - n = list->dim1info->numInArray - 1; - if (n >= 0){ + if (n < list->dim1info->numInArray){ 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); } } } +void clearListOfArrays(ListOfArrays* list){ + list->next_free_index = 0; +} + void freeListOfArrays(ListOfArrays* list){ freeDynArrayDeep(list->dim1info,&VMS_int__free); VMS_int__free((void*)list); diff -r 5df9392eca1a -r abf2117d7535 ListOfArrays.h --- a/ListOfArrays.h Tue Mar 13 18:31:06 2012 -0700 +++ b/ListOfArrays.h Fri Aug 31 18:27:26 2012 +0200 @@ -12,15 +12,10 @@ #include "DynArray/DynArray.h" -typedef struct { - void* next; - void* data; -} ArrayFragment; typedef struct { void** dim1; PrivDynArrayInfo* dim1info; - //ArrayFragment* last; size_t entry_size; int num_entries_per_fragment; int next_free_index; @@ -30,7 +25,7 @@ #define addToListOfArrays(type,value,list) do { \ int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \ - if(offset_in_fragment == 0){ \ + if(offset_in_fragment == 0 && (list->next_free_index / list->num_entries_per_fragment) >= list->dim1info->numInArray){ \ void* newBlock = VMS_int__malloc(list->entry_size * list->num_entries_per_fragment); \ addToDynArray(newBlock,list->dim1info); \ } \ @@ -41,7 +36,7 @@ #define addToListOfArrays_ext(type,value,list) do { \ int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \ - if(offset_in_fragment == 0){ \ + if(offset_in_fragment == 0 && (list->next_free_index / list->num_entries_per_fragment) >= list->dim1info->numInArray){ \ void* newBlock = malloc(list->entry_size * list->num_entries_per_fragment); \ addToDynArray(newBlock,list->dim1info); \ } \ @@ -54,6 +49,8 @@ void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr); +void clearListOfArrays(ListOfArrays* list); + #define valueInListOfArrays(type,index,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] #define setValueInListOfArrays(type,index,value,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] = value