00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <nodeset.h>
00019
00020
00021 static nsitem_t *mkItem(Dt_t * d, nsitem_t * obj, Dtdisc_t * disc)
00022 {
00023 nsitem_t *ap = GNEW(nsitem_t);
00024
00025 ap->np = obj->np;
00026 return ap;
00027 }
00028
00029 static void freeItem(Dt_t * d, nsitem_t * obj, Dtdisc_t * disc)
00030 {
00031 free(obj);
00032 }
00033
00034 static int
00035 cmpItem(Dt_t * d, Agnode_t ** key1, Agnode_t ** key2, Dtdisc_t * disc)
00036 {
00037 if (*key1 > *key2)
00038 return 1;
00039 else if (*key1 < *key2)
00040 return -1;
00041 else
00042 return 0;
00043 }
00044
00045 static Dtdisc_t nodeDisc = {
00046 offsetof(nsitem_t, np),
00047 sizeof(Agnode_t *),
00048 offsetof(nsitem_t, link),
00049 (Dtmake_f) mkItem,
00050 (Dtfree_f) freeItem,
00051 (Dtcompar_f) cmpItem,
00052 (Dthash_f) 0,
00053 (Dtmemory_f) 0,
00054 (Dtevent_f) 0
00055 };
00056
00057
00058
00059
00060 nodeset_t *mkNodeset()
00061 {
00062 nodeset_t *s = dtopen(&nodeDisc, Dtoset);
00063 return s;
00064 }
00065
00066
00067
00068
00069
00070 void freeNodeset(nodeset_t * s)
00071 {
00072 if (s != NULL)
00073 dtclose(s);
00074 }
00075
00076
00077
00078
00079 void clearNodeset(nodeset_t * s)
00080 {
00081 dtclear(s);
00082 }
00083
00084
00085
00086
00087 void insertNodeset(nodeset_t * ns, Agnode_t * n)
00088 {
00089 nsitem_t key;
00090
00091 key.np = n;
00092 dtinsert(ns, &key);
00093 }
00094
00095 void removeNodeset(nodeset_t * ns, Agnode_t * n)
00096 {
00097 nsitem_t key;
00098
00099 key.np = n;
00100 dtdelete(ns, &key);
00101 }
00102
00103
00104
00105
00106 int sizeNodeset(nodeset_t * ns)
00107 {
00108 return dtsize(ns);
00109 }
00110
00111
00112
00113
00114
00115 void printNodeset(nodeset_t * ns)
00116 {
00117 nsitem_t *ip;
00118 for (ip = (nsitem_t *) dtfirst(ns); ip;
00119 ip = (nsitem_t *) dtnext(ns, ip)) {
00120 fprintf(stderr, "%s", ip->np->name);
00121 }
00122 fputs("\n", stderr);
00123 }