24#define CDT_VERSION 20050420L
31#define CDT_API __declspec(dllexport)
33#define CDT_API __declspec(dllimport)
49typedef void* (*Dtsearch_f)(
Dt_t*,
void*,int);
97#define DTDISC(dc, ky, sz, lk, mkf, frf, cmpf) \
98 ( (dc)->key = (ky), (dc)->size = (sz), (dc)->link = (lk), \
99 (dc)->makef = (mkf), (dc)->freef = (frf), \
100 (dc)->comparf = (cmpf) )
124#define DT_SET 0000001
125#define DT_OSET 0000004
126#define DT_OBAG 0000010
127#define DT_QUEUE 0000100
128#define DT_METHODS 0000377
131#define DT_INSERT 0000001
132#define DT_DELETE 0000002
133#define DT_SEARCH 0000004
134#define DT_NEXT 0000010
135#define DT_PREV 0000020
136#define DT_RENEW 0000040
137#define DT_CLEAR 0000100
138#define DT_FIRST 0000200
139#define DT_LAST 0000400
140#define DT_MATCH 0001000
141#define DT_VSEARCH 0002000
142#define DT_DETACH 0010000
172#define _DT(dt) ((Dt_t*)(dt))
173#define _DTDSC(dc,ky,sz,lk,cmpf) \
174 (ky = dc->key, sz = dc->size, lk = dc->link, cmpf = dc->comparf)
175#define _DTLNK(o,lk) ((Dtlink_t*)((char*)(o) + lk) )
176#define _DTOBJ(e,lk) (lk < 0 ? ((Dthold_t*)(e))->obj : (void*)((char*)(e) - lk) )
177#define _DTKEY(o,ky,sz) (void*)(sz < 0 ? *((char**)((char*)(o)+ky)) : ((char*)(o)+ky))
179#define _DTCMP(k1, k2, cmpf, sz) \
180 (cmpf ? (cmpf)(k1, k2) : \
181 (sz <= 0 ? strcmp(k1,k2) : memcmp(k1,k2,(size_t)sz)) )
183#define dtlink(d,e) (((Dtlink_t*)(e))->right)
184#define dtobj(d,e) _DTOBJ((e), _DT(d)->disc->link)
185#define dtfinger(d) (_DT(d)->data->here ? dtobj((d),_DT(d)->data->here):(void*)(0))
187#define dtfirst(d) (*(_DT(d)->searchf))((d),(void*)(0),DT_FIRST)
188#define dtnext(d,o) (*(_DT(d)->searchf))((d),(void*)(o),DT_NEXT)
189#define dtlast(d) (*(_DT(d)->searchf))((d),(void*)(0),DT_LAST)
190#define dtprev(d,o) (*(_DT(d)->searchf))((d),(void*)(o),DT_PREV)
191#define dtsearch(d,o) (*(_DT(d)->searchf))((d),(void*)(o),DT_SEARCH)
192#define dtmatch(d,o) (*(_DT(d)->searchf))((d),(void*)(o),DT_MATCH)
193#define dtinsert(d,o) (*(_DT(d)->searchf))((d),(void*)(o),DT_INSERT)
194#define dtdelete(d,o) (*(_DT(d)->searchf))((d),(void*)(o),DT_DELETE)
195#define dtdetach(d,o) (*(_DT(d)->searchf))((d),(void*)(o),DT_DETACH)
196#define dtclear(d) (*(_DT(d)->searchf))((d),(void*)(0),DT_CLEAR)
198#define DT_PRIME 17109811
void *(* Dtmake_f)(void *, Dtdisc_t *)
CDT_API int dtwalk(Dt_t *, int(*)(void *, void *), void *)
CDT_API Dtmethod_t * dtmethod(Dt_t *, Dtmethod_t *)
int(* Dtcompar_f)(void *, void *)
CDT_API Dtmethod_t * Dtset
set with unique elements
CDT_API Dtlink_t * dtflatten(Dt_t *)
CDT_API Dtmethod_t * Dtobag
ordered multiset
CDT_API Dtmethod_t _Dtqueue
CDT_API Dtlink_t * dtextract(Dt_t *)
CDT_API int dtsize(Dt_t *)
CDT_API unsigned int dtstrhash(void *, int)
CDT_API Dt_t * dtview(Dt_t *, Dt_t *)
CDT_API Dtmethod_t _Dttree
CDT_API Dtmethod_t * Dttree
CDT_API int dtclose(Dt_t *)
CDT_API void * dtrenew(Dt_t *, void *)
CDT_API Dtmethod_t * Dtoset
ordered set (self-adjusting tree)
CDT_API Dtmethod_t * Dtqueue
queue: insert at top, delete at tail
void *(* Dtsearch_f)(Dt_t *, void *, int)
CDT_API int dtstat(Dt_t *, Dtstat_t *, int)
CDT_API int dtrestore(Dt_t *, Dtlink_t *)
CDT_API Dtdisc_t * dtdisc(Dt_t *dt, Dtdisc_t *)
CDT_API Dt_t * dtopen(Dtdisc_t *, Dtmethod_t *)