| 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
|