2
2
* @file
3
3
* @brief container data types API
4
4
* @ingroup public_apis
5
+ *
6
+ * **CDT** manages run-time dictionaries using standard container data types:
7
+ * unordered set/multiset, ordered set/multiset, list, stack, and queue.
8
+ *
9
+ * [man 3 cdt](https://graphviz.org/pdf/cdt.3.pdf)
10
+ *
5
11
*/
6
12
7
13
#pragma once
@@ -42,11 +48,9 @@ typedef struct _dt_s Dict_t; /* for libdict compatibility */
42
48
typedef struct _dtstat_s Dtstat_t ;
43
49
typedef void * (* Dtmemory_f )(Dt_t * ,void * ,size_t ,Dtdisc_t * );
44
50
typedef void * (* Dtsearch_f )(Dt_t * ,void * ,int );
45
- typedef void * (* Dtmake_f )(Dt_t * , void * ,Dtdisc_t * );
46
- typedef void (* Dtfree_f )(Dt_t * , void * ,Dtdisc_t * );
51
+ typedef void * (* Dtmake_f )(void * ,Dtdisc_t * );
52
+ typedef void (* Dtfree_f )(void * ,Dtdisc_t * );
47
53
typedef int (* Dtcompar_f )(Dt_t * ,void * ,void * ,Dtdisc_t * );
48
- typedef unsigned int (* Dthash_f )(Dt_t * ,void * ,Dtdisc_t * );
49
- typedef int (* Dtevent_f )(Dt_t * ,int ,void * ,Dtdisc_t * );
50
54
51
55
struct _dtlink_s
52
56
{ Dtlink_t * right ; /* right child */
@@ -79,8 +83,6 @@ struct _dtdata_s
79
83
int ntab ; /* number of hash slots */
80
84
int size ; /* number of objects */
81
85
int loop ; /* number of nested loops */
82
- int minp ; /* min path before splay, always even */
83
- /* for hash dt, > 0: fixed table size */
84
86
};
85
87
86
88
/* structure to hold methods that manipulate an object */
@@ -91,16 +93,14 @@ struct _dtdisc_s
91
93
Dtmake_f makef ; /* object constructor */
92
94
Dtfree_f freef ; /* object destructor */
93
95
Dtcompar_f comparf ;/* to compare two objects */
94
- Dthash_f hashf ; /* to compute hash value of an object */
95
96
Dtmemory_f memoryf ;/* to allocate/free memory */
96
- Dtevent_f eventf ; /* to process events */
97
97
};
98
98
99
- #define DTDISC (dc ,ky ,sz ,lk ,mkf ,frf ,cmpf ,hshf , memf , evf ) \
99
+ #define DTDISC (dc , ky , sz , lk , mkf , frf , cmpf , memf ) \
100
100
( (dc)->key = (ky), (dc)->size = (sz), (dc)->link = (lk), \
101
101
(dc)->makef = (mkf), (dc)->freef = (frf), \
102
- (dc)->comparf = (cmpf), (dc)->hashf = (hshf), \
103
- (dc)->memoryf = (memf), (dc)->eventf = (evf) )
102
+ (dc)->comparf = (cmpf), \
103
+ (dc)->memoryf = (memf) )
104
104
105
105
/* the dictionary structure itself */
106
106
struct _dt_s
@@ -130,19 +130,11 @@ struct _dtstat_s
130
130
131
131
/* supported storage methods */
132
132
#define DT_SET 0000001 /* set with unique elements */
133
- #define DT_BAG 0000002 /* multiset */
134
133
#define DT_OSET 0000004 /* ordered set (self-adjusting tree) */
135
134
#define DT_OBAG 0000010 /* ordered multiset */
136
- #define DT_LIST 0000020 /* linked list */
137
- #define DT_STACK 0000040 /* stack: insert/delete at top */
138
135
#define DT_QUEUE 0000100 /* queue: insert at top, delete at tail */
139
- #define DT_DEQUE 0000200 /* deque: insert at top, append at tail */
140
136
#define DT_METHODS 0000377 /* all currently supported methods */
141
137
142
- /* asserts to dtdisc() */
143
- #define DT_SAMECMP 0000001 /* compare methods equivalent */
144
- #define DT_SAMEHASH 0000002 /* hash methods equivalent */
145
-
146
138
/* types of search */
147
139
#define DT_INSERT 0000001 /* insert object if not found */
148
140
#define DT_DELETE 0000002 /* delete object if found */
@@ -155,54 +147,34 @@ struct _dtstat_s
155
147
#define DT_LAST 0000400 /* get last object */
156
148
#define DT_MATCH 0001000 /* find object matching key */
157
149
#define DT_VSEARCH 0002000 /* search using internal representation */
158
- #define DT_ATTACH 0004000 /* attach an object to the dictionary */
159
150
#define DT_DETACH 0010000 /* detach an object from the dictionary */
160
- #define DT_APPEND 0020000 /* used on Dtlist to append an object */
161
-
162
- /* events */
163
- #define DT_OPEN 1 /* a dictionary is being opened */
164
- #define DT_CLOSE 2 /* a dictionary is being closed */
165
- #define DT_DISC 3 /* discipline is about to be changed */
166
- #define DT_METH 4 /* method is about to be changed */
167
- #define DT_ENDOPEN 5 /* dtopen() is done */
168
- #define DT_ENDCLOSE 6 /* dtclose() is done */
169
- #define DT_HASHSIZE 7 /* setting hash table size */
170
151
171
152
CDT_API extern Dtmethod_t * Dtset ; ///< set with unique elements
172
- CDT_API extern Dtmethod_t * Dtbag ; ///< multiset
173
153
CDT_API extern Dtmethod_t * Dtoset ; ///< ordered set (self-adjusting tree)
174
154
CDT_API extern Dtmethod_t * Dtobag ; ///< ordered multiset
175
- CDT_API extern Dtmethod_t * Dtlist ; ///< linked list
176
- CDT_API extern Dtmethod_t * Dtstack ; ///< stack: insert/delete at top
177
155
CDT_API extern Dtmethod_t * Dtqueue ; ///< queue: insert at top, delete at tail
178
- CDT_API extern Dtmethod_t * Dtdeque ; ///< deque: insert at top, append at tail
179
156
180
- CDT_API extern Dtmethod_t * Dtorder ;
181
157
CDT_API extern Dtmethod_t * Dttree ;
182
- CDT_API extern Dtmethod_t * Dthash ;
183
158
CDT_API extern Dtmethod_t _Dttree ;
184
- CDT_API extern Dtmethod_t _Dthash ;
185
- CDT_API extern Dtmethod_t _Dtlist ;
186
159
CDT_API extern Dtmethod_t _Dtqueue ;
187
- CDT_API extern Dtmethod_t _Dtstack ;
188
160
189
161
CDT_API Dt_t * dtopen (Dtdisc_t * , Dtmethod_t * );
190
162
CDT_API int dtclose (Dt_t * );
191
163
CDT_API Dt_t * dtview (Dt_t * , Dt_t * );
192
- CDT_API Dtdisc_t * dtdisc (Dt_t * dt , Dtdisc_t * , int );
164
+ CDT_API Dtdisc_t * dtdisc (Dt_t * dt , Dtdisc_t * );
193
165
CDT_API Dtmethod_t * dtmethod (Dt_t * , Dtmethod_t * );
194
166
195
167
CDT_API Dtlink_t * dtflatten (Dt_t * );
196
168
CDT_API Dtlink_t * dtextract (Dt_t * );
197
169
CDT_API int dtrestore (Dt_t * , Dtlink_t * );
198
170
199
- CDT_API int dtwalk (Dt_t * , int (* )(Dt_t * , void * ,void * ), void * );
171
+ CDT_API int dtwalk (Dt_t * , int (* )(void * ,void * ), void * );
200
172
201
173
CDT_API void * dtrenew (Dt_t * , void * );
202
174
203
175
CDT_API int dtsize (Dt_t * );
204
176
CDT_API int dtstat (Dt_t * , Dtstat_t * , int );
205
- CDT_API unsigned int dtstrhash (unsigned int , void * , int );
177
+ CDT_API unsigned int dtstrhash (void * , int );
206
178
207
179
/* internal functions for translating among holder, object and key */
208
180
#define _DT (dt ) ((Dt_t*)(dt))
@@ -215,41 +187,6 @@ CDT_API unsigned int dtstrhash(unsigned int, void*, int);
215
187
#define _DTCMP (dt ,k1 ,k2 ,dc ,cmpf ,sz ) \
216
188
(cmpf ? (*cmpf)(dt,k1,k2,dc) : \
217
189
(sz <= 0 ? strcmp(k1,k2) : memcmp(k1,k2,(size_t)sz)) )
218
- #define _DTHSH (dt ,ky ,dc ,sz ) (dc->hashf ? (*dc->hashf)(dt,ky,dc) : dtstrhash(0,ky,sz) )
219
-
220
- /* special search function for tree structure only */
221
- #define _DTMTCH (dt ,key ,action ) \
222
- do { Dtlink_t* _e; void *_o, *_k, *_key; Dtdisc_t* _dc; \
223
- int _ky, _sz, _lk, _cmp; Dtcompar_f _cmpf; \
224
- _dc = (dt)->disc; _DTDSC(_dc, _ky, _sz, _lk, _cmpf); \
225
- _key = (key); \
226
- for(_e = (dt)->data->here; _e; _e = _cmp < 0 ? _e->hl._left : _e->right) \
227
- { _o = _DTOBJ(_e, _lk); _k = _DTKEY(_o, _ky, _sz); \
228
- if((_cmp = _DTCMP((dt), _key, _k, _dc, _cmpf, _sz)) == 0) \
229
- break; \
230
- } \
231
- action (_e ? _o : (void*)0); \
232
- } while(0)
233
-
234
- #define _DTSRCH (dt ,obj ,action ) \
235
- do { Dtlink_t* _e; void *_o, *_k, *_key; Dtdisc_t* _dc; \
236
- int _ky, _sz, _lk, _cmp; Dtcompar_f _cmpf; \
237
- _dc = (dt)->disc; _DTDSC(_dc, _ky, _sz, _lk, _cmpf); \
238
- _key = _DTKEY(obj, _ky, _sz); \
239
- for(_e = (dt)->data->here; _e; _e = _cmp < 0 ? _e->hl._left : _e->right) \
240
- { _o = _DTOBJ(_e, _lk); _k = _DTKEY(_o, _ky, _sz); \
241
- if((_cmp = _DTCMP((dt), _key, _k, _dc, _cmpf, _sz)) == 0) \
242
- break; \
243
- } \
244
- action (_e ? _o : (void*)0); \
245
- } while(0)
246
-
247
- #define DTTREEMATCH (dt ,key ,action ) _DTMTCH(_DT(dt),(void*)(key),action)
248
- #define DTTREESEARCH (dt ,obj ,action ) _DTSRCH(_DT(dt),(void*)(obj),action)
249
-
250
- #define dtvnext (d ) (_DT(d)->view)
251
- #define dtvcount (d ) (_DT(d)->nview)
252
- #define dtvhere (d ) (_DT(d)->walk)
253
190
254
191
#define dtlink (d ,e ) (((Dtlink_t*)(e))->right)
255
192
#define dtobj (d ,e ) _DTOBJ((e), _DT(d)->disc->link)
@@ -264,19 +201,19 @@ CDT_API unsigned int dtstrhash(unsigned int, void*, int);
264
201
#define dtsearch (d ,o ) (*(_DT(d)->searchf))((d),(void*)(o),DT_SEARCH)
265
202
#define dtmatch (d ,o ) (*(_DT(d)->searchf))((d),(void*)(o),DT_MATCH)
266
203
#define dtinsert (d ,o ) (*(_DT(d)->searchf))((d),(void*)(o),DT_INSERT)
267
- #define dtappend (d ,o ) (*(_DT(d)->searchf))((d),(void*)(o),DT_INSERT|DT_APPEND)
268
204
#define dtdelete (d ,o ) (*(_DT(d)->searchf))((d),(void*)(o),DT_DELETE)
269
- #define dtattach (d ,o ) (*(_DT(d)->searchf))((d),(void*)(o),DT_ATTACH)
270
205
#define dtdetach (d ,o ) (*(_DT(d)->searchf))((d),(void*)(o),DT_DETACH)
271
206
#define dtclear (d ) (*(_DT(d)->searchf))((d),(void*)(0),DT_CLEAR)
272
207
#define dtfound (d ) (_DT(d)->type & DT_FOUND)
273
208
274
209
#define DT_PRIME 17109811 /* 2#00000001 00000101 00010011 00110011 */
275
- #define dtcharhash (h ,c ) (((unsigned int)(h) + (unsigned int)(c)) * DT_PRIME )
276
210
277
211
/**
278
212
* @dir lib/cdt
279
213
* @brief container data types, API cdt.h
214
+ *
215
+ * [man 3 cdt](https://graphviz.org/pdf/cdt.3.pdf)
216
+ *
280
217
*/
281
218
282
219
#ifdef __cplusplus
0 commit comments