comparison ListOfArrays.h @ 12:abf2117d7535

make lists clearable
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Fri, 31 Aug 2012 18:27:26 +0200
parents f75ec4738afc
children 7128ffdcc797
comparison
equal deleted inserted replaced
7:09ad83642b31 8:81f3c9cbb078
10 10
11 #include<stddef.h> 11 #include<stddef.h>
12 #include "DynArray/DynArray.h" 12 #include "DynArray/DynArray.h"
13 13
14 14
15 typedef struct {
16 void* next;
17 void* data;
18 } ArrayFragment;
19 15
20 typedef struct { 16 typedef struct {
21 void** dim1; 17 void** dim1;
22 PrivDynArrayInfo* dim1info; 18 PrivDynArrayInfo* dim1info;
23 //ArrayFragment* last;
24 size_t entry_size; 19 size_t entry_size;
25 int num_entries_per_fragment; 20 int num_entries_per_fragment;
26 int next_free_index; 21 int next_free_index;
27 } ListOfArrays; 22 } ListOfArrays;
28 23
29 ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block); 24 ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block);
30 25
31 #define addToListOfArrays(type,value,list) do { \ 26 #define addToListOfArrays(type,value,list) do { \
32 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \ 27 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \
33 if(offset_in_fragment == 0){ \ 28 if(offset_in_fragment == 0 && (list->next_free_index / list->num_entries_per_fragment) >= list->dim1info->numInArray){ \
34 void* newBlock = VMS_int__malloc(list->entry_size * list->num_entries_per_fragment); \ 29 void* newBlock = VMS_int__malloc(list->entry_size * list->num_entries_per_fragment); \
35 addToDynArray(newBlock,list->dim1info); \ 30 addToDynArray(newBlock,list->dim1info); \
36 } \ 31 } \
37 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \ 32 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \
38 typedFragment[offset_in_fragment] = value; \ 33 typedFragment[offset_in_fragment] = value; \
39 list->next_free_index++; \ 34 list->next_free_index++; \
40 } while (0) 35 } while (0)
41 36
42 #define addToListOfArrays_ext(type,value,list) do { \ 37 #define addToListOfArrays_ext(type,value,list) do { \
43 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \ 38 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \
44 if(offset_in_fragment == 0){ \ 39 if(offset_in_fragment == 0 && (list->next_free_index / list->num_entries_per_fragment) >= list->dim1info->numInArray){ \
45 void* newBlock = malloc(list->entry_size * list->num_entries_per_fragment); \ 40 void* newBlock = malloc(list->entry_size * list->num_entries_per_fragment); \
46 addToDynArray(newBlock,list->dim1info); \ 41 addToDynArray(newBlock,list->dim1info); \
47 } \ 42 } \
48 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \ 43 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \
49 typedFragment[offset_in_fragment] = value; \ 44 typedFragment[offset_in_fragment] = value; \
52 47
53 typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void * 48 typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void *
54 49
55 void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr); 50 void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr);
56 51
52 void clearListOfArrays(ListOfArrays* list);
53
57 #define valueInListOfArrays(type,index,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] 54 #define valueInListOfArrays(type,index,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment]
58 55
59 #define setValueInListOfArrays(type,index,value,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] = value 56 #define setValueInListOfArrays(type,index,value,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] = value
60 57
61 void freeListOfArrays(ListOfArrays* list); 58 void freeListOfArrays(ListOfArrays* list);