diff --git a/STL_Extension/include/CGAL/Modifiable_priority_queue.h b/STL_Extension/include/CGAL/Modifiable_priority_queue.h index 765605a5777..cdad2f2aef6 100644 --- a/STL_Extension/include/CGAL/Modifiable_priority_queue.h +++ b/STL_Extension/include/CGAL/Modifiable_priority_queue.h @@ -17,11 +17,13 @@ #include #include +#include + #include namespace CGAL { -enum Heap_type { CGAL_BOOST_PENDING_MUTABLE_QUEUE, CGAL_BOOST_PENDING_RELAXED_HEAP }; +enum Heap_type { CGAL_BOOST_FIBONACCI_HEAP, CGAL_BOOST_PENDING_MUTABLE_QUEUE, CGAL_BOOST_PENDING_RELAXED_HEAP }; template @@ -89,6 +91,88 @@ private: } ; +template +class Modifiable_priority_queue +{ +public: + + typedef Modifiable_priority_queue Self; + + typedef IndexedType_ IndexedType ; + typedef Compare_ Compare; + typedef ID_ ID ; + + struct Reverse_compare{ + const Compare c; + Reverse_compare(){} + Reverse_compare(Compare const& c):c(c){} + template + bool operator() (T const& a, T const& b) const + { + return !c(a,b); + } + }; + + typedef boost::heap::fibonacci_heap > Heap; + + typedef typename Heap::value_type value_type; + typedef typename Heap::size_type size_type; + +public: + + Modifiable_priority_queue( size_type largest_ID, Compare const& c = Compare(), ID const& id = ID() ) + : mHeap(Reverse_compare(c)) + , mID(id) + , mHandles(largest_ID) + {} + + void push ( value_type const& v ) { mHandles[get(mID, v)]=mHeap.push(v) ; } + + void update ( value_type const& v ) { mHeap.update(mHandles[get(mID, v)]); } + + void erase ( value_type const& v ) { + auto vid = get(mID, v); + mHeap.erase(mHandles[vid]); + mHandles[vid]=typename Heap::handle_type(); + } + + value_type top() const { return mHeap.top(); } + + void pop() { mHeap.pop(); } + + bool empty() const { return mHeap.empty() ; } + + bool contains ( value_type const& v ) { return mHandles[get(mID, v)] != typename Heap::handle_type(); } + + boost::optional extract_top() + { + boost::optional r ; + if ( !empty() ) + { + value_type v = top(); + pop(); + r = boost::optional(v) ; + } + return r ; + } + + value_type top_and_pop() + { + CGAL_precondition(!empty()); + value_type v = top(); + pop(); + return v; + } + +private: + + Heap mHeap ; + ID mID; + std::vector mHandles; +} ; + } //namespace CGAL #endif