X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Finclude%2Fpqueue.hh;h=fa28ca011d574eec179824653de1368fabcdda97;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=4ccd72d176c28ce4b0b6a5500f55bd9c6438e90b;hpb=fc3e875d6bf06f0680e897faffdcab36ad975a03;p=lilypond.git diff --git a/flower/include/pqueue.hh b/flower/include/pqueue.hh index 4ccd72d176..fa28ca011d 100644 --- a/flower/include/pqueue.hh +++ b/flower/include/pqueue.hh @@ -3,107 +3,127 @@ source file of the Flower Library - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2008 Han-Wen Nienhuys */ - #ifndef PQUEUE_HH #define PQUEUE_HH -#include "array.hh" - +#include "std-vector.hh" template struct PQueue_ent { - T val; - K key; + T val; + K key; }; template -int compare (PQueue_ent const &e1 , PQueue_ent const &e2) { - return compare (e1.key , e2.key); +int compare (PQueue_ent const &e1, PQueue_ent const &e2) +{ + return compare (e1.key, e2.key); } /** - Priority queue using a (variable size) in-situ heap. + Priority queue using a (variable size) in-situ heap. + + Hungarian postfix pq - Hungarian postfix pq - - TODO: add increase/decrease operations, - add max () operation - */ + TODO: add increase/decrease operations, + add max () operation +*/ template -class PQueue { - Array heap_arr_; - T &elt (int i) { - return heap_arr_[i-1]; - } - T const&elt (int i) const { - return heap_arr_[i-1]; - } +class PQueue +{ + vector heap_array_; + T &elt (vsize i) + { + return heap_array_[i - 1]; + } + T const &elt (vsize i) const + { + return heap_array_[i - 1]; + } public: - /** acces an heap element. Careful with this, as changing the + /** acces an heap element. Careful with this, as changing the priority might fuck up the invariants @param 1 <= i < size () */ - T& operator[] (int i) { return heap_arr_[i]; } - T operator[] (int i) const { return heap_arr_[i]; } - void OK () const - { + T &operator [] (vsize i) + { + return heap_array_[i]; + } + T operator [] (vsize i) const + { + return heap_array_[i]; + } + void OK () const + { #ifndef NDEBUG - for (int i =2; i <= size (); i++) - assert (compare (elt (i/2), elt (i)) <= 0); + for (vsize i = 2; i <= size (); i++) + assert (compare (elt (i / 2), elt (i)) <= 0); #endif - } - T front () const { return elt (1); } - int size () const { return heap_arr_.size (); } - void insert (T v) { - heap_arr_.push (v); - int i = heap_arr_.size (); - int j = i / 2 ; - while (j) { - if (compare (elt (j), v) > 0) { - elt (i) = elt (j); - i = j; - j = i/2; - } else { - break; - } - } - elt (i) = v; - OK (); - } - T max () const { - //int first_leaf_i = size (); - T max_t; - return max_t; - } - void delmin () { - assert (size ()); - T last = heap_arr_.top (); - - int mini=2; - int lasti=1; + } + T front () const + { + return elt (1); + } + vsize size () const + { + return heap_array_.size (); + } + void insert (T v) + { + heap_array_.push_back (v); + vsize i = heap_array_.size (); + vsize j = i / 2; + while (j) + { + if (compare (elt (j), v) > 0) + { + elt (i) = elt (j); + i = j; + j = i / 2; + } + else + break; + } + elt (i) = v; + OK (); + } + T max () const + { + //int first_leaf_i = size (); + T max_t; + return max_t; + } + void delmin () + { + assert (size ()); + T last = heap_array_.back (); - while (mini < size ()) { - if (compare (elt (mini + 1), elt (mini)) <0) - mini++; - if (compare (last,elt (mini)) < 0) - break; - elt (lasti) = elt (mini); - lasti = mini; - mini *= 2; - } - elt (lasti) = last; - heap_arr_.pop (); - OK (); - } - T get () { - T t = front (); - delmin (); - return t; - } -}; + vsize mini = 2; + vsize lasti = 1; + while (mini < size ()) + { + if (compare (elt (mini + 1), elt (mini)) < 0) + mini++; + if (compare (last, elt (mini)) < 0) + break; + elt (lasti) = elt (mini); + lasti = mini; + mini *= 2; + } + elt (lasti) = last; + heap_array_.pop_back (); + OK (); + } + T get () + { + T t = front (); + delmin (); + return t; + } +}; #endif // PQUEUE_HH