annotate ListOfArrays.h @ 16:7731a4d31baa

new branch -- Univ_dev -- changed headers and PR__malloc
author Sean Halle <seanhalle@yahoo.com>
date Tue, 23 Jul 2013 07:30:42 -0700
parents 70c43c8fbded
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@16 12 #include <inttypes.h>
seanhalle@16 13
seanhalle@16 14 #include "PR__common_includes/PR__primitive_data_types.h"
seanhalle@8 15 #include "DynArray/DynArray.h"
nengel@2 16
nengel@1 17
nengel@0 18 typedef struct {
nengel@1 19 void* next;
nengel@0 20 void* data;
nengel@0 21 } ArrayFragment;
nengel@0 22
nengel@0 23 typedef struct {
nengel@2 24 void** dim1;
nengel@2 25 PrivDynArrayInfo* dim1info;
nengel@2 26 //ArrayFragment* last;
nengel@0 27 size_t entry_size;
nengel@0 28 int num_entries_per_fragment;
nengel@0 29 int next_free_index;
nengel@0 30 } ListOfArrays;
nengel@0 31
nengel@1 32 ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block);
nengel@1 33
nengel@0 34 #define addToListOfArrays(type,value,list) do { \
nengel@0 35 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \
nengel@0 36 if(offset_in_fragment == 0){ \
seanhalle@16 37 void* newBlock = PR__malloc(list->entry_size * list->num_entries_per_fragment); \
nengel@2 38 addToDynArray(newBlock,list->dim1info); \
nengel@0 39 } \
nengel@2 40 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \
nengel@0 41 typedFragment[offset_in_fragment] = value; \
nengel@1 42 list->next_free_index++; \
nengel@0 43 } while (0)
nengel@0 44
nengel@5 45 #define addToListOfArrays_ext(type,value,list) do { \
nengel@5 46 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; \
nengel@5 47 if(offset_in_fragment == 0){ \
nengel@5 48 void* newBlock = malloc(list->entry_size * list->num_entries_per_fragment); \
nengel@5 49 addToDynArray(newBlock,list->dim1info); \
nengel@5 50 } \
nengel@5 51 type* typedFragment = (type*) ((list->dim1)[list->dim1info->numInArray -1]); \
nengel@5 52 typedFragment[offset_in_fragment] = value; \
nengel@5 53 list->next_free_index++; \
nengel@5 54 } while (0)
nengel@5 55
nengel@0 56 typedef void (*ListOfArraysFnPtr) ( void * ); //fn has to cast void *
nengel@0 57
nengel@1 58 void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr);
nengel@1 59
nengel@3 60 #define valueInListOfArrays(type,index,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment]
nengel@1 61
nengel@3 62 #define setValueInListOfArrays(type,index,value,list) ((type*)((list->dim1)[index / list->num_entries_per_fragment]))[index % list->num_entries_per_fragment] = value
nengel@1 63
nengel@4 64 void freeListOfArrays(ListOfArrays* list);
nengel@4 65
nengel@0 66 #endif /* LISTOFARRAYS_H */
nengel@0 67