annotate ListOfArrays.h @ 13:7128ffdcc797

have allocation in coreloop use VMS_WL__malloc
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Mon, 29 Oct 2012 16:53:01 +0100
parents abf2117d7535
children
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
nengel@0 16 typedef struct {
nengel@2 17 void** dim1;
nengel@2 18 PrivDynArrayInfo* dim1info;
nengel@0 19 size_t entry_size;
nengel@0 20 int num_entries_per_fragment;
nengel@0 21 int next_free_index;
nengel@0 22 } ListOfArrays;
nengel@0 23
nengel@1 24 ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block);
nengel@1 25
nengel@0 26 #define addToListOfArrays(type,value,list) do { \
nengel@0 27 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \
nengel@12 28 if(offset_in_fragment == 0 && (list->next_free_index / list->num_entries_per_fragment) >= list->dim1info->numInArray){ \
seanhalle@8 29 void* newBlock = VMS_int__malloc(list->entry_size * list->num_entries_per_fragment); \
nengel@2 30 addToDynArray(newBlock,list->dim1info); \
nengel@0 31 } \
nengel@2 32 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \
nengel@0 33 typedFragment[offset_in_fragment] = value; \
nengel@1 34 list->next_free_index++; \
nengel@0 35 } while (0)
nengel@0 36
nengel@5 37 #define addToListOfArrays_ext(type,value,list) do { \
nengel@5 38 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \
nengel@12 39 if(offset_in_fragment == 0 && (list->next_free_index / list->num_entries_per_fragment) >= list->dim1info->numInArray){ \
nengel@13 40 void* newBlock = VMS_WL__malloc(list->entry_size * list->num_entries_per_fragment); \
nengel@5 41 addToDynArray(newBlock,list->dim1info); \
nengel@5 42 } \
nengel@5 43 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \
nengel@5 44 typedFragment[offset_in_fragment] = value; \
nengel@5 45 list->next_free_index++; \
nengel@5 46 } while (0)
nengel@5 47
nengel@0 48 typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void *
nengel@0 49
nengel@1 50 void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr);
nengel@1 51
nengel@12 52 void clearListOfArrays(ListOfArrays* list);
nengel@12 53
nengel@3 54 #define valueInListOfArrays(type,index,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment]
nengel@1 55
nengel@3 56 #define setValueInListOfArrays(type,index,value,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] = value
nengel@1 57
nengel@4 58 void freeListOfArrays(ListOfArrays* list);
nengel@4 59
nengel@0 60 #endif /* LISTOFARRAYS_H */
nengel@0 61