From: Matthew Fernandez Date: Sun, 11 Apr 2021 02:06:31 +0000 (-0700) Subject: replace some qsort calls with std::sort X-Git-Tag: 2.47.2~55^2~8 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9264b5f3287320f1c433e71d2cbe1d7874d7a877;p=graphviz replace some qsort calls with std::sort This is safer and has the potential to be more efficient. Note that this required rewriting the involved comparator to judge less-than instead of a three-outcome comparison. --- diff --git a/lib/vpsc/generate-constraints.cpp b/lib/vpsc/generate-constraints.cpp index 459f7f55e..bee95cb1c 100644 --- a/lib/vpsc/generate-constraints.cpp +++ b/lib/vpsc/generate-constraints.cpp @@ -16,6 +16,7 @@ * Adaptagrams repository. */ +#include #include #include #include @@ -124,20 +125,18 @@ struct Event { Event(EventType t, Node *v, double p) : type(t),v(v),pos(p) {}; }; -int compare_events(const void *a, const void *b) { - Event *ea=*(Event**)a; - Event *eb=*(Event**)b; +static bool compare_events(const Event *ea, const Event *eb) { if(ea->v->r==eb->v->r) { // when comparing opening and closing from the same rect // open must come first - if(ea->type==Open) return -1; - return 1; + if(ea->type == Open && eb->type != Open) return true; + return false; } else if(ea->pos > eb->pos) { - return 1; + return false; } else if(ea->pos < eb->pos) { - return -1; + return true; } - return 0; + return false; } /** @@ -154,7 +153,7 @@ int generateXConstraints(const int n, Rectangle** rs, Variable** vars, Constrain events[ctr++]=new Event(Open,v,rs[i]->getMinY()); events[ctr++]=new Event(Close,v,rs[i]->getMaxY()); } - qsort((Event*)events.data(), (size_t)2*n, sizeof(Event*), compare_events ); + std::sort(events.begin(), events.end(), compare_events); NodeSet scanline; vector constraints; @@ -237,7 +236,7 @@ int generateYConstraints(const int n, Rectangle** rs, Variable** vars, Constrain events[ctr++]=new Event(Open,v,rs[i]->getMinX()); events[ctr++]=new Event(Close,v,rs[i]->getMaxX()); } - qsort((Event*)events.data(), (size_t)2*n, sizeof(Event*), compare_events ); + std::sort(events.begin(), events.end(), compare_events); NodeSet scanline; vector constraints; for(i=0;i<2*n;i++) {