00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "edgelist.h"
00019 #include <assert.h>
00020
00021 static edgelistitem *mkItem(Dt_t * d, edgelistitem * obj, Dtdisc_t * disc)
00022 {
00023 edgelistitem *ap = GNEW(edgelistitem);
00024
00025 ap->edge = obj->edge;
00026 return ap;
00027 }
00028
00029 static void freeItem(Dt_t * d, edgelistitem * obj, Dtdisc_t * disc)
00030 {
00031 free(obj);
00032 }
00033
00034 static int
00035 cmpItem(Dt_t * d, Agedge_t ** key1, Agedge_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 ELDisc = {
00046 offsetof(edgelistitem, edge),
00047 sizeof(Agedge_t *),
00048 offsetof(edgelistitem, 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 edgelist *init_edgelist()
00058 {
00059 edgelist *list = dtopen(&ELDisc, Dtoset);
00060 return list;
00061 }
00062
00063 void free_edgelist(edgelist * list)
00064 {
00065 dtclose(list);
00066 }
00067
00068 void add_edge(edgelist * list, Agedge_t * e)
00069 {
00070 edgelistitem temp;
00071
00072 temp.edge = e;
00073 dtinsert(list, &temp);
00074 }
00075
00076 void remove_edge(edgelist * list, Agedge_t * e)
00077 {
00078 edgelistitem temp;
00079
00080 temp.edge = e;
00081 dtdelete(list, &temp);
00082 }
00083
00084 #ifdef DEBUG
00085 void print_edge(edgelist * list)
00086 {
00087 edgelistitem *temp;
00088 Agedge_t *ep;
00089
00090 for (temp = (edgelistitem *) dtflatten(list); temp;
00091 temp = (edgelistitem *) dtlink(list, (Dtlink_t *) temp)) {
00092 ep = temp->edge;
00093 fprintf(stderr, "%s--%s \n", ep->tail->name, ep->head->name);
00094 }
00095 fputs("\n", stderr);
00096 }
00097 #endif
00098
00099 int size_edgelist(edgelist * list)
00100 {
00101 return dtsize(list);
00102 }