# HG changeset patch # User Nina Engelhardt # Date 1324297530 -3600 # Node ID bc4b3434367ff81a0048bab0be8ea0386fedc4ac bare bones - create, add, iter diff -r 000000000000 -r bc4b3434367f ListOfArrays.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ListOfArrays.c Mon Dec 19 13:25:30 2011 +0100 @@ -0,0 +1,31 @@ + +#include "ListOfArrays.h" +#include "../vmalloc.h" + +ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block){ + ListOfArrays* newLoA = (ListOfArrays*) VMS__malloc(sizeof(ListOfArrays)); + newLoA->first = NULL; + newLoA->last = NULL; + newLoA->entry_size = entry_size; + newLoA->num_entries_per_fragment = num_entries_per_block; + newLoA->next_free_index = 0; + + return newLoA; +} + +void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr){ + ArrayFragment* current = list->first; + while(current->next){ + uintptr_t p; + for(p = current->data; p < current->data + list->num_entries_per_fragment * list->entry_size; p += list->entry_size){ + (*fnPtr)(p); + } + current = current->next; + } + //assert(current == list->last); + int offset_in_last = list->next_free_index % list->num_entries_per_fragment; + uintptr_t p; + for(p = current->data; p < current->data + offset_in_last * list->entry_size; p += list->entry_size){ + (*fnPtr)(p); + } +} \ No newline at end of file diff -r 000000000000 -r bc4b3434367f ListOfArrays.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ListOfArrays.h Mon Dec 19 13:25:30 2011 +0100 @@ -0,0 +1,44 @@ +/* + * File: ListOfArrays.h + * Author: Nina Engelhardt + * + * Created on December 16, 2011, 2:06 PM + */ + +#ifndef LISTOFARRAYS_H +#define LISTOFARRAYS_H + +typedef struct { + ArrayFragment* next; + void* data; +} ArrayFragment; + +typedef struct { + ArrayFragment* first; + ArrayFragment* last; + size_t entry_size; + int num_entries_per_fragment; + int next_free_index; +} ListOfArrays; + +#define addToListOfArrays(type,value,list) do { \ + int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \ + if(offset_in_fragment == 0){ \ + ArrayFragment* newBlock = (ArrayFragment*) VMS__malloc(sizeof(ArrayFragment*) + list->entry_size * list->num_entries_per_fragment); \ + newBlock->next == NULL; \ + if(list->first == NULL) {\ + list->first = newBlock; \ + } \ + if(list->last != NULL) { \ + list->last->next = newBlock; \ + } \ + list->last = newBlock; \ + } \ + (type*) typedFragment = (type*) list->last->data; \ + typedFragment[offset_in_fragment] = value; \ +} while (0) + +typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void * + +#endif /* LISTOFARRAYS_H */ +