Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > ListOfArrays
comparison ListOfArrays.c @ 2:ef1712d6d7d8
change internal structure from list to dynarray
| author | Nina Engelhardt <nengel@mailbox.tu-berlin.de> |
|---|---|
| date | Tue, 20 Dec 2011 18:52:57 +0100 |
| parents | fd441e4d0908 |
| children | 9c577efe70cd |
comparison
equal
deleted
inserted
replaced
| 1:634e0ab819c3 | 2:3c0d10426c6c |
|---|---|
| 2 #include "ListOfArrays.h" | 2 #include "ListOfArrays.h" |
| 3 #include "../vmalloc.h" | 3 #include "../vmalloc.h" |
| 4 | 4 |
| 5 ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block){ | 5 ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block){ |
| 6 ListOfArrays* newLoA = (ListOfArrays*) VMS__malloc(sizeof(ListOfArrays)); | 6 ListOfArrays* newLoA = (ListOfArrays*) VMS__malloc(sizeof(ListOfArrays)); |
| 7 newLoA->first = NULL; | 7 newLoA->dim1info = makePrivDynArrayOfSize(&(newLoA->dim1),8); |
| 8 newLoA->last = NULL; | 8 |
| 9 | |
| 9 newLoA->entry_size = entry_size; | 10 newLoA->entry_size = entry_size; |
| 10 newLoA->num_entries_per_fragment = num_entries_per_block; | 11 newLoA->num_entries_per_fragment = num_entries_per_block; |
| 11 newLoA->next_free_index = 0; | 12 newLoA->next_free_index = 0; |
| 12 | 13 |
| 13 return newLoA; | 14 return newLoA; |
| 14 } | 15 } |
| 15 | 16 |
| 16 void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr){ | 17 void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr){ |
| 17 ArrayFragment* current = list->first; | 18 int n; |
| 18 int num_full_blocks = (list->next_free_index / list->num_entries_per_fragment); | |
| 19 uintptr_t p; | 19 uintptr_t p; |
| 20 while(num_full_blocks > 0){ | 20 for(n=0;n<list->dim1info->numInArray -1; n++){ |
| 21 for(p = (uintptr_t)&(current->data); p < (uintptr_t) &(current->data) + list->num_entries_per_fragment * list->entry_size; p += list->entry_size){ | 21 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){ |
| 22 (*fnPtr)((void*)p); | 22 (*fnPtr)((void*)p); |
| 23 } | 23 } |
| 24 current = (ArrayFragment*) current->next; | |
| 25 num_full_blocks--; | |
| 26 } | 24 } |
| 27 //assert(current == list->last); | |
| 28 int offset_in_last = list->next_free_index % list->num_entries_per_fragment; | 25 int offset_in_last = list->next_free_index % list->num_entries_per_fragment; |
| 29 | 26 n = list->dim1info->numInArray - 1; |
| 30 for(p = (uintptr_t)&(current->data); p < (uintptr_t)&(current->data) + offset_in_last * list->entry_size; p += list->entry_size){ | 27 if (n >= 0){ |
| 31 (*fnPtr)((void*)p); | 28 for(p = (uintptr_t)(list->dim1)[n]; p < (uintptr_t)(list->dim1)[n] + offset_in_last * list->entry_size; p += list->entry_size){ |
| 29 (*fnPtr)((void*)p); | |
| 30 } | |
| 32 } | 31 } |
| 33 } | 32 } |
| 33 | |
| 34 /* | |
| 35 void addToListOfArraysDependency(Dependency value, ListOfArrays* list){ | |
| 36 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; | |
| 37 if(offset_in_fragment == 0){ | |
| 38 void* newBlock = VMS__malloc(list->entry_size * list->num_entries_per_fragment); | |
| 39 addToDynArray(newBlock,list->dim1info); | |
| 40 } | |
| 41 Dependency* typedFragment = (Dependency*) ((list->dim1)[list->dim1info->numInArray -1]); | |
| 42 typedFragment[offset_in_fragment] = value; | |
| 43 list->next_free_index++; | |
| 44 } | |
| 45 | |
| 46 void addToListOfArraysUnit(Unit value, ListOfArrays* list){ | |
| 47 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; | |
| 48 if(offset_in_fragment == 0){ | |
| 49 void* newBlock = VMS__malloc(list->entry_size * list->num_entries_per_fragment); | |
| 50 addToDynArray(newBlock,list->dim1info); | |
| 51 } | |
| 52 Unit* typedFragment = (Unit*) ((list->dim1)[list->dim1info->numInArray -1]); | |
| 53 typedFragment[offset_in_fragment] = value; | |
| 54 list->next_free_index++; | |
| 55 } | |
| 56 */ |
