Agedge_t *agfstin(Agraph_t * g, Agnode_t * n) { Agsubnode_t *sn; Agedge_t *e = NILedge; sn = agsubrep(g, n); dtrestore(g->e_seq, sn->in_seq); e = (Agedge_t *) dtfirst(g->e_seq); sn->in_seq = dtextract(g->e_seq); return e; }
int agdegree(Agraph_t * g, Agnode_t * n, int want_in, int want_out) { Agsubnode_t *sn; int rv = 0; sn = agsubrep(g, n); if (sn) { if (want_out) rv += cnt(g->e_seq,&(sn->out_seq)); if (want_in) rv += cnt(g->e_seq,&(sn->in_seq)); } return rv; }
/* return first outedge of <n> */ Agedge_t *agfstout(Agraph_t * g, Agnode_t * n) { Agsubnode_t *sn; Agedge_t *e = NILedge; sn = agsubrep(g, n); if (sn) { dtrestore(g->e_seq, sn->out_seq); e = (Agedge_t *) dtfirst(g->e_seq); sn->out_seq = dtextract(g->e_seq); } return e; }
Agedge_t *agnxtin(Agraph_t * g, Agedge_t * e) { Agnode_t *n; Agsubnode_t *sn; Agedge_t *f; n = AGHEAD(e); sn = agsubrep(g, n); dtrestore(g->e_seq, sn->in_seq); f = (Agedge_t *) dtnext(g->e_seq, e); sn->in_seq = dtextract(g->e_seq); return f; }
/* return outedge that follows <e> of <n> */ Agedge_t *agnxtout(Agraph_t * g, Agedge_t * e) { Agnode_t *n; Agsubnode_t *sn; Agedge_t *f = NILedge; n = AGTAIL(e); sn = agsubrep(g, n); if (sn) { dtrestore(g->e_seq, sn->out_seq); f = (Agedge_t *) dtnext(g->e_seq, e); sn->out_seq = dtextract(g->e_seq); } return f; }
int agcountuniqedges(Agraph_t * g, Agnode_t * n, int want_in, int want_out) { Agedge_t *e; Agsubnode_t *sn; int rv = 0; sn = agsubrep(g, n); if (want_out) rv = cnt(g->e_seq,&(sn->out_seq)); if (want_in) { if (!want_out) rv += cnt(g->e_seq,&(sn->in_seq)); /* cheap */ else { /* less cheap */ for (e = agfstin(g, n); e; e = agnxtin(g, e)) if (e->node != n) rv++; /* don't double count loops */ } } return rv; }