Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > ListOfArrays
changeset 0:bc4b3434367f
bare bones - create, add, iter
| author | Nina Engelhardt <nengel@mailbox.tu-berlin.de> |
|---|---|
| date | Mon, 19 Dec 2011 13:25:30 +0100 |
| parents | |
| children | fd441e4d0908 |
| files | ListOfArrays.c ListOfArrays.h |
| diffstat | 2 files changed, 75 insertions(+), 0 deletions(-) [+] |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/ListOfArrays.c Mon Dec 19 13:25:30 2011 +0100 1.3 @@ -0,0 +1,31 @@ 1.4 + 1.5 +#include "ListOfArrays.h" 1.6 +#include "../vmalloc.h" 1.7 + 1.8 +ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block){ 1.9 + ListOfArrays* newLoA = (ListOfArrays*) VMS__malloc(sizeof(ListOfArrays)); 1.10 + newLoA->first = NULL; 1.11 + newLoA->last = NULL; 1.12 + newLoA->entry_size = entry_size; 1.13 + newLoA->num_entries_per_fragment = num_entries_per_block; 1.14 + newLoA->next_free_index = 0; 1.15 + 1.16 + return newLoA; 1.17 +} 1.18 + 1.19 +void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr){ 1.20 + ArrayFragment* current = list->first; 1.21 + while(current->next){ 1.22 + uintptr_t p; 1.23 + for(p = current->data; p < current->data + list->num_entries_per_fragment * list->entry_size; p += list->entry_size){ 1.24 + (*fnPtr)(p); 1.25 + } 1.26 + current = current->next; 1.27 + } 1.28 + //assert(current == list->last); 1.29 + int offset_in_last = list->next_free_index % list->num_entries_per_fragment; 1.30 + uintptr_t p; 1.31 + for(p = current->data; p < current->data + offset_in_last * list->entry_size; p += list->entry_size){ 1.32 + (*fnPtr)(p); 1.33 + } 1.34 +} 1.35 \ No newline at end of file
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/ListOfArrays.h Mon Dec 19 13:25:30 2011 +0100 2.3 @@ -0,0 +1,44 @@ 2.4 +/* 2.5 + * File: ListOfArrays.h 2.6 + * Author: Nina Engelhardt 2.7 + * 2.8 + * Created on December 16, 2011, 2:06 PM 2.9 + */ 2.10 + 2.11 +#ifndef LISTOFARRAYS_H 2.12 +#define LISTOFARRAYS_H 2.13 + 2.14 +typedef struct { 2.15 + ArrayFragment* next; 2.16 + void* data; 2.17 +} ArrayFragment; 2.18 + 2.19 +typedef struct { 2.20 + ArrayFragment* first; 2.21 + ArrayFragment* last; 2.22 + size_t entry_size; 2.23 + int num_entries_per_fragment; 2.24 + int next_free_index; 2.25 +} ListOfArrays; 2.26 + 2.27 +#define addToListOfArrays(type,value,list) do { \ 2.28 + int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \ 2.29 + if(offset_in_fragment == 0){ \ 2.30 + ArrayFragment* newBlock = (ArrayFragment*) VMS__malloc(sizeof(ArrayFragment*) + list->entry_size * list->num_entries_per_fragment); \ 2.31 + newBlock->next == NULL; \ 2.32 + if(list->first == NULL) {\ 2.33 + list->first = newBlock; \ 2.34 + } \ 2.35 + if(list->last != NULL) { \ 2.36 + list->last->next = newBlock; \ 2.37 + } \ 2.38 + list->last = newBlock; \ 2.39 + } \ 2.40 + (type*) typedFragment = (type*) list->last->data; \ 2.41 + typedFragment[offset_in_fragment] = value; \ 2.42 +} while (0) 2.43 + 2.44 +typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void * 2.45 + 2.46 +#endif /* LISTOFARRAYS_H */ 2.47 +
