-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathccl_internal.h
400 lines (371 loc) · 12.9 KB
/
ccl_internal.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
#ifndef __CCL_INTERNAL_H__
#define __CCL_INTERNAL_H__
#ifdef NO_C99
/* No flexible arrays */
#define MINIMUM_ARRAY_INDEX 1
#else
/* Use C99 features */
#define MINIMUM_ARRAY_INDEX
#endif
#ifdef SPARC32 /* old sparcs are missing this protptype */
int snprintf(char *restrict s, size_t n, const char *restrict format, ...);
#endif
/* This macro supposes that n is a power of two */
#define roundupTo(x,n) (((x)+((n)-1))&(~((n)-1)))
#define roundup(x) roundupTo(x,sizeof(void *))
/* This function is needed to read a line from a file.
The resulting line is allocated with the given memory manager
*/
int GetLine(char **LinePointer,int *n, FILE *stream,ContainerAllocator *mm);
int WGetLine(wchar_t **LinePointer,int *n, FILE *stream,ContainerAllocator *mm);
/* GUIDs used to mark saved container files */
typedef struct {
uint32_t Data1;
uint16_t Data2;
uint16_t Data3;
unsigned char Data4[8];
} guid;
/*----------------------------------------------------------------------------*/
/* Definition of the Mask type */
/*----------------------------------------------------------------------------*/
struct _Mask {
size_t length;
const ContainerAllocator *Allocator;
char data[MINIMUM_ARRAY_INDEX];
};
/*----------------------------------------------------------------------------*/
/* Definition of the Generic container type */
/*----------------------------------------------------------------------------*/
struct _GenericContainer {
struct tagGenericContainerInterface *vTable;
size_t count; /* number of elements in the container */
unsigned int Flags; /* Read-only or other flags */
};
typedef struct tagGenericIterator {
Iterator it;
GenericContainer *Gen;
} GenericIterator;
typedef struct tagSequentialIterator {
Iterator it;
SequentialContainer *Gen;
} SequentialIterator;
/*----------------------------------------------------------------------------*/
/* Definition of the vector type */
/*----------------------------------------------------------------------------*/
struct _Vector {
VectorInterface *VTable; /* The table of functions */
size_t count; /* number of elements in the array */
unsigned int Flags; /* Read-only or other flags */
size_t ElementSize; /* Size of the elements stored in this array. */
void *contents; /* The contents of the collection */
size_t capacity; /* allocated space in the contents vector */
unsigned timestamp; /* Incremented at each change */
CompareFunction CompareFn; /* Element comparison function */
ErrorFunction RaiseError; /* Error function */
const ContainerAllocator *Allocator;
DestructorFunction DestructorFn;
} ;
#define VECTOR_MAGIC_NUMBER 91188767725543433LL
struct VectorIterator {
Iterator it;
long long Magic;
Vector *AL;
size_t index;
unsigned timestamp;
unsigned long Flags;
void *Current;
char ElementBuffer[1];
};
/*----------------------------------------------------------------------------*/
/* Definition of the bitstring type */
/*----------------------------------------------------------------------------*/
struct _BitString {
BitStringInterface *VTable; /* The table of functions */
size_t count; /* number of elements in the array */
BIT_TYPE *contents; /* The contents of the collection */
size_t capacity; /* allocated space in the contents vector */
unsigned timestamp;
unsigned int Flags; /* Read-only or other flags */
const ContainerAllocator *Allocator;
} ;
/*----------------------------------------------------------------------------*/
/* Definition of the list and list element type */
/*----------------------------------------------------------------------------*/
struct _ListElement {
struct _ListElement *Next;
#ifdef SPARC32
void *alignment;
#endif
char Data[MINIMUM_ARRAY_INDEX];
};
struct _List {
ListInterface *VTable; /* Methods table */
size_t count; /* in elements units */
unsigned Flags;
unsigned timestamp; /* Changed at each modification */
size_t ElementSize; /* Size (in bytes) of each element */
ListElement *Last; /* The last item */
ListElement *First; /* The contents of the list start here */
CompareFunction Compare; /* Element comparison function */
ErrorFunction RaiseError; /* Error function */
ContainerHeap *Heap;
const ContainerAllocator *Allocator;
DestructorFunction DestructorFn;
};
#define LIST_MAGIC_NUMBER 86644334455544331LL
struct ListIterator {
Iterator it;
long long Magic;
List *L;
size_t index;
ListElement *Current;
ListElement *Previous;
unsigned timestamp;
char ElementBuffer[1];
};
/*----------------------------------------------------------------------------*/
/* dlist */
/*----------------------------------------------------------------------------*/
struct _DlistElement {
struct _DlistElement *Next;
struct _DlistElement *Previous;
char Data[MINIMUM_ARRAY_INDEX];
};
#define DLIST_MAGIC_NUMBER 59987410094961187LL
struct Dlist {
DlistInterface *VTable;
size_t count; /* in elements units */
unsigned Flags;
unsigned timestamp;
size_t ElementSize;
DlistElement *Last; /* The last item */
DlistElement *First; /* The contents of the Dlist start here */
DlistElement *FreeList;
CompareFunction Compare; /* Element comparison function */
ErrorFunction RaiseError; /* Error function */
ContainerHeap *Heap;
const ContainerAllocator *Allocator;
DestructorFunction DestructorFn;
};
struct DListIterator {
Iterator it;
long long Magic;
Dlist *L;
size_t index;
DlistElement *Current;
unsigned timestamp;
char ElementBuffer[1];
};
/*----------------------------------------------------------------------------*/
/* Dictionary */
/*----------------------------------------------------------------------------*/
struct _Dictionary {
DictionaryInterface *VTable;
size_t count;
unsigned Flags;
size_t size;
ErrorFunction RaiseError;
unsigned timestamp;
size_t ElementSize;
const ContainerAllocator *Allocator;
DestructorFunction DestructorFn;
HashFunction hash;
struct DataList {
struct DataList *Next;
char *Key;
void *Value;
} **buckets;
};
#define DICTIONARY_MAGIC_NUMBER 89098765432123456LL
struct DictionaryIterator {
Iterator it;
long long Magic;
Dictionary *Dict;
size_t index;
struct DataList *dl;
unsigned timestamp;
unsigned long Flags;
};
/*----------------------------------------------------------------------------*/
/* Wide character dictionary (key is wchar_t) */
/*----------------------------------------------------------------------------*/
struct _WDictionary {
WDictionaryInterface *VTable;
size_t count;
unsigned Flags;
size_t size;
ErrorFunction RaiseError;
unsigned timestamp;
size_t ElementSize;
const ContainerAllocator *Allocator;
DestructorFunction DestructorFn;
WHashFunction hash;
struct WDataList {
struct WDataList *Next;
wchar_t *Key;
void *Value;
} **buckets;
};
#define WDICTIONARY_MAGIC_NUMBER 78909876543212345LL
struct WDictionaryIterator {
Iterator it;
long long Magic;
WDictionary *Dict;
size_t index;
struct WDataList *dl;
unsigned timestamp;
unsigned long Flags;
};
/*----------------------------------------------------------------------------*/
/* Hash table */
/*----------------------------------------------------------------------------*/
typedef struct _HashEntry {
struct _HashEntry *next;
unsigned int hash;
const void *key;
size_t klen;
char val[1];
} HashEntry ;
/*
* Data structure for iterating through a hash table.
*
* We keep a pointer to the next hash entry here to allow the current
* hash entry to be freed or otherwise mangled between calls to
* hash_next().
*/
typedef struct _HashIndex {
HashTable *ht;
HashEntry *This, *next;
unsigned int index;
} HashIndex;
/*
* The size of the array is always a power of two. We use the maximum
* index rather than the size so that we can use bitwise-AND for
* modular arithmetic.
* The count of hash entries may be greater depending on the chosen
* collision rate.
*/
struct _HashTable {
HashTableInterface *VTable;
Pool *pool;
HashEntry **array;
HashIndex iterator; /* For hash_first(NULL, ...) */
unsigned int count, max;
GeneralHashFunction Hash;
HashEntry *free; /* List of recycled entries */
unsigned Flags;
ErrorFunction RaiseError;
unsigned timestamp;
size_t ElementSize;
const ContainerAllocator *Allocator;
DestructorFunction DestructorFn;
};
#define HASHTABLE_MAGIC_NUMBER 654321234567890LL
struct HashTableIterator {
Iterator it;
long long Magic;
HashTable *ht;
HashIndex hi;
unsigned timestamp;
unsigned long Flags;
HashIndex *Current;
};
/*----------------------------------------------------------------------------*/
/* Tree map */
/*----------------------------------------------------------------------------*/
/* Node in a balanced binary tree. */
struct Node {
struct Node *up; /* Parent (NULL for root). */
struct Node *down[2]; /* Left child, right child. */
#ifdef SPARC32
double alignment;
#endif
char data[1];
};
/* A balanced binary tree. */
struct tagTreeMap {
TreeMapInterface *VTable;
size_t count; /* Current node count. */
struct Node *root; /* Tree's root, NULL if empty. */
CompareFunction compare; /* To compare nodes. */
ErrorFunction RaiseError;
CompareInfo *aux; /* Auxiliary data. */
size_t ElementSize;
size_t max_size; /* Max size since last complete rebalance. */
unsigned Flags;
unsigned timestamp;
ContainerHeap *Heap;
const ContainerAllocator *Allocator;
DestructorFunction DestructorFn;
};
#define BST_MAX_HEIGHT 40
#define TREE_MAGIC_NUMBER 32123456789098765LL
struct TreeMapIterator {
Iterator it;
TreeMap *bst_table;
struct Node *bst_node;
unsigned timestamp;
size_t bst_height;
struct Node *bst_stack[BST_MAX_HEIGHT];
unsigned long Flags;
};
/*----------------------------------------------------------------------------*/
/* String collections */
/*----------------------------------------------------------------------------*/
/* Definition of the String Collection type */
struct strCollection {
strCollectionInterface *VTable; /* The table of functions */
size_t count; /* in element size units */
unsigned int Flags; /* Read-only or other flags */
char **contents; /* The contents of the collection */
size_t capacity; /* in element_size units */
unsigned timestamp;
ErrorFunction RaiseError;
StringCompareFn strcompare;
CompareInfo *StringCompareContext;
const ContainerAllocator *Allocator;
DestructorFunction DestructorFn;
};
/* Definition of the wide string Collection type */
struct WstrCollection {
WstrCollectionInterface *VTable; /* The table of functions */
size_t count; /* in element size units */
unsigned int Flags; /* Read-only or other flags */
wchar_t **contents; /* The contents of the collection */
size_t capacity; /* in element_size units */
unsigned timestamp;
ErrorFunction RaiseError;
StringCompareFn strcompare;
CompareInfo *StringCompareContext;
const ContainerAllocator *Allocator;
DestructorFunction DestructorFn;
};
#define CCL_PRIORITY_MIN (INT_MIN+1)
#define CCL_PRIORITY_MAX (INT_MAX-1)
/*----------------------------------------------------------------------------*/
/* Heap object */
/*----------------------------------------------------------------------------*/
#define INVALID_POINTER_VALUE (void *)(~0)
struct tagHeapObject {
HeapInterface *VTable;
unsigned BlockCount;
unsigned CurrentBlock;
unsigned BlockIndex;
char **Heap;
size_t ElementSize;
void *FreeList;
const ContainerAllocator *Allocator;
size_t MemoryUsed;
unsigned timestamp;
};
#define HEAP_MAGIC_NUMBER 6655443322112244LL
struct HeapIterator {
Iterator it;
long long Magic;
ContainerHeap *Heap;
size_t BlockNumber;
size_t BlockPosition;
size_t timestamp;
unsigned long Flags;
};
#endif