/* This software may only be used by you under license from AT&T Corp. ("AT&T"). A copy of AT&T's Source Code Agreement is available at AT&T's Internet website having the URL: If you received this software without first entering into a license with AT&T, you have an infringing copy of this software and cannot use it without violating AT&T's intellectual property rights. */ #pragma prototyped #include #include "mem.h" #include "hedges.h" #include "heap.h" #include "render.h" static Halfedge *PQhash; static int PQhashsize; static int PQcount; static int PQmin; static int PQbucket(Halfedge *he) { int bucket; bucket = (he->ystar - ymin)/deltay * PQhashsize; if (bucket<0) bucket = 0; if (bucket>=PQhashsize) bucket = PQhashsize-1 ; if (bucket < PQmin) PQmin = bucket; return(bucket); } void PQinsert(Halfedge *he, Site *v, double offset) { Halfedge *last, *next; he -> vertex = v; ref(v); he -> ystar = v -> coord.y + offset; last = &PQhash[PQbucket(he)]; while ((next = last -> PQnext) != (struct Halfedge *) NULL && (he -> ystar > next -> ystar || (he -> ystar == next -> ystar && v -> coord.x > next->vertex->coord.x))) { last = next; } he -> PQnext = last -> PQnext; last -> PQnext = he; PQcount += 1; } void PQdelete(Halfedge *he) { Halfedge *last; if(he -> vertex != (Site *) NULL) { last = &PQhash[PQbucket(he)]; while (last -> PQnext != he) last = last -> PQnext; last -> PQnext = he -> PQnext; PQcount -= 1; deref(he -> vertex); he -> vertex = (Site *) NULL; } } int PQempty() { return(PQcount==0); } Point PQ_min() { Point answer; while(PQhash[PQmin].PQnext == (struct Halfedge *)NULL) {PQmin += 1;} answer.x = PQhash[PQmin].PQnext -> vertex -> coord.x; answer.y = PQhash[PQmin].PQnext -> ystar; return (answer); } Halfedge * PQextractmin() { Halfedge *curr; curr = PQhash[PQmin].PQnext; PQhash[PQmin].PQnext = curr -> PQnext; PQcount -= 1; return(curr); } void PQcleanup() { free (PQhash); PQhash = NULL; } void PQinitialize() { int i; PQcount = 0; PQmin = 0; PQhashsize = 4 * sqrt_nsites; if (PQhash == NULL) PQhash = N_GNEW(PQhashsize, Halfedge); for(i=0; iELleft, p->ELright, p->ELedge->edgenbr, p->ELrefcnt, p->ELpm, (p->vertex ? p->vertex->sitenbr : -1), p->ystar); } void PQdump() { int i; Halfedge *p; for(i=0; iPQnext; } } }