#pragma once #include #include "CurveskelHelper.h" namespace CurveskelTypes{ class MyPriorityQueue { public: class EdgeCompareFunctor{ public: CurveskelTypes::ScalarEdgeProperty elengths; EdgeCompareFunctor(CurveskelModel* skel){ elengths = skel->edge_property("e:length"); } bool operator() (const CurveskelTypes::Edge& lhs, const CurveskelTypes::Edge& rhs) const{ CurveskelTypes::Scalar p0 = elengths[lhs]; CurveskelTypes::Scalar p1 = elengths[rhs]; return (p0 == p1) ? (lhs.idx() set; MyPriorityQueue(CurveskelModel* skel) : compareFunctor(skel), set(compareFunctor){} void insert(CurveskelTypes::Edge edge, CurveskelTypes::Scalar length){ compareFunctor.elengths[edge] = length; set.insert(edge); } CurveskelTypes::Edge pop(){ CurveskelTypes::Edge e = *(set.begin()); set.erase(e); compareFunctor.elengths[e] = -1.0; return e; } bool update(CurveskelTypes::Edge edge, CurveskelTypes::Scalar /*length*/){ // erase the edge int nerased = set.erase(edge); if( nerased != 1 ){ qDebug() << "I was supposed to erase one element, but I erased: " << nerased; return false; } // re-insert it set.insert(edge); return true; } bool empty(){ return set.empty(); } bool has(CurveskelTypes::Edge edge){ return set.find(edge) != set.end(); } }; }