annotate ListOfArrays.h @ 10:5df9392eca1a

More progress towards getting common_ancestor working
author Some Random Person <seanhalle@yahoo.com>
date Tue, 13 Mar 2012 18:31:06 -0700
parents 0e6cc9d9ec67
children abf2117d7535 70c43c8fbded
rev   line source
nengel@0 1 /*
nengel@0 2 * File: ListOfArrays.h
nengel@0 3 * Author: Nina Engelhardt
nengel@0 4 *
nengel@0 5 * Created on December 16, 2011, 2:06 PM
nengel@0 6 */
nengel@0 7
seanhalle@9 8 #ifndef _LISTOFARRAYS_H
seanhalle@9 9 #define _LISTOFARRAYS_H
nengel@0 10
nengel@1 11 #include<stddef.h>
seanhalle@8 12 #include "DynArray/DynArray.h"
nengel@2 13
nengel@1 14
nengel@0 15 typedef struct {
nengel@1 16 void* next;
nengel@0 17 void* data;
nengel@0 18 } ArrayFragment;
nengel@0 19
nengel@0 20 typedef struct {
nengel@2 21 void** dim1;
nengel@2 22 PrivDynArrayInfo* dim1info;
nengel@2 23 //ArrayFragment* last;
nengel@0 24 size_t entry_size;
nengel@0 25 int num_entries_per_fragment;
nengel@0 26 int next_free_index;
nengel@0 27 } ListOfArrays;
nengel@0 28
nengel@1 29 ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block);
nengel@1 30
nengel@0 31 #define addToListOfArrays(type,value,list) do { \
nengel@0 32 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \
nengel@0 33 if(offset_in_fragment == 0){ \
seanhalle@8 34 void* newBlock = VMS_int__malloc(list->entry_size * list->num_entries_per_fragment); \
nengel@2 35 addToDynArray(newBlock,list->dim1info); \
nengel@0 36 } \
nengel@2 37 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \
nengel@0 38 typedFragment[offset_in_fragment] = value; \
nengel@1 39 list->next_free_index++; \
nengel@0 40 } while (0)
nengel@0 41
nengel@5 42 #define addToListOfArrays_ext(type,value,list) do { \
nengel@5 43 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \
nengel@5 44 if(offset_in_fragment == 0){ \
nengel@5 45 void* newBlock = malloc(list->entry_size * list->num_entries_per_fragment); \
nengel@5 46 addToDynArray(newBlock,list->dim1info); \
nengel@5 47 } \
nengel@5 48 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \
nengel@5 49 typedFragment[offset_in_fragment] = value; \
nengel@5 50 list->next_free_index++; \
nengel@5 51 } while (0)
nengel@5 52
nengel@0 53 typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void *
nengel@0 54
nengel@1 55 void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr);
nengel@1 56
nengel@3 57 #define valueInListOfArrays(type,index,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment]
nengel@1 58
nengel@3 59 #define setValueInListOfArrays(type,index,value,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] = value
nengel@1 60
nengel@4 61 void freeListOfArrays(ListOfArrays* list);
nengel@4 62
nengel@0 63 #endif /* LISTOFARRAYS_H */
nengel@0 64