annotate ListOfArrays.h @ 3:9c577efe70cd

added random access and free
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Wed, 21 Dec 2011 14:28:51 +0100
parents ef1712d6d7d8
children 53df05eb8d43
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
nengel@0 8 #ifndef LISTOFARRAYS_H
nengel@0 9 #define LISTOFARRAYS_H
nengel@0 10
nengel@1 11 #include<stddef.h>
nengel@2 12 #include "../DynArray/DynArray.h"
nengel@2 13 #include "../../dependency.h"
nengel@2 14
nengel@1 15
nengel@0 16 typedef struct {
nengel@1 17 void* next;
nengel@0 18 void* data;
nengel@0 19 } ArrayFragment;
nengel@0 20
nengel@0 21 typedef struct {
nengel@2 22 void** dim1;
nengel@2 23 PrivDynArrayInfo* dim1info;
nengel@2 24 //ArrayFragment* last;
nengel@0 25 size_t entry_size;
nengel@0 26 int num_entries_per_fragment;
nengel@0 27 int next_free_index;
nengel@0 28 } ListOfArrays;
nengel@0 29
nengel@1 30 ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block);
nengel@1 31
nengel@0 32 #define addToListOfArrays(type,value,list) do { \
nengel@0 33 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \
nengel@0 34 if(offset_in_fragment == 0){ \
nengel@2 35 void* newBlock = VMS__malloc(list->entry_size * list->num_entries_per_fragment); \
nengel@2 36 addToDynArray(newBlock,list->dim1info); \
nengel@0 37 } \
nengel@2 38 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \
nengel@0 39 typedFragment[offset_in_fragment] = value; \
nengel@1 40 list->next_free_index++; \
nengel@0 41 } while (0)
nengel@0 42
nengel@2 43 //void addToListOfArraysDependency(Dependency value, ListOfArrays* list);
nengel@2 44 //void addToListOfArraysUnit(Unit value, ListOfArrays* list);
nengel@2 45
nengel@0 46 typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void *
nengel@0 47
nengel@1 48 void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr);
nengel@1 49
nengel@3 50 #define valueInListOfArrays(type,index,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment]
nengel@1 51
nengel@3 52 #define setValueInListOfArrays(type,index,value,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] = value
nengel@1 53
nengel@0 54 #endif /* LISTOFARRAYS_H */
nengel@0 55