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 */