#pragma prototyped
#include <nodeset.h>
static nsitem_t*
mkItem (Dt_t* d,nsitem_t* obj,Dtdisc_t* disc)
{
nsitem_t* ap = GNEW(nsitem_t);
ap->np = obj->np;
return ap;
}
static void
freeItem (Dt_t* d,nsitem_t* obj,Dtdisc_t* disc)
{
free (obj);
}
static int
cmpItem(Dt_t* d, Agnode_t** key1, Agnode_t** key2, Dtdisc_t* disc)
{
if (*key1 > *key2) return 1;
else if (*key1 < *key2) return -1;
else return 0;
}
static Dtdisc_t nodeDisc = {
offsetof(nsitem_t,np),
sizeof(Agnode_t*),
offsetof(nsitem_t,link),
(Dtmake_f)mkItem,
(Dtfree_f)freeItem,
(Dtcompar_f)cmpItem,
(Dthash_f)0,
(Dtmemory_f)0,
(Dtevent_f)0
};
nodeset_t*
mkNodeset()
{
nodeset_t* s = dtopen (&nodeDisc, Dtoset);
return s;
}
void
freeNodeset(nodeset_t* s)
{
if(s != NULL)
dtclose (s);
}
void
clearNodeset(nodeset_t* s)
{
dtclear (s);
}
void
insertNodeset(nodeset_t* ns, Agnode_t* n)
{
nsitem_t key;
key.np = n;
dtinsert(ns, &key);
}
void
removeNodeset(nodeset_t* ns, Agnode_t* n)
{
nsitem_t key;
key.np = n;
dtdelete (ns, &key);
}
int
sizeNodeset(nodeset_t* ns)
{
return dtsize(ns);
}
void printNodeset(nodeset_t* ns)
{
nsitem_t* ip;
for (ip = (nsitem_t*)dtfirst(ns); ip; ip = (nsitem_t*)dtnext(ns,ip)) {
fprintf (stderr, "%s", ip->np->name);
}
fputs("\n", stderr);
}