Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > ListOfArrays
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); |
