You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by so...@apache.org on 2016/11/04 14:44:30 UTC

[trafficserver] 02/05: TS-4537 Add `erase` method to PriorityQueue (#708)

This is an automated email from the ASF dual-hosted git repository.

sorber pushed a commit to branch 6.2.x
in repository https://git-dual.apache.org/repos/asf/trafficserver.git

commit 921d2cb24f74bdc937df7c03406c26a841fe6bfc
Author: Thomas Jackson <ja...@gmail.com>
AuthorDate: Tue Jun 14 23:05:04 2016 -0700

    TS-4537 Add `erase` method to PriorityQueue (#708)
    
    This closes #708
    (cherry picked from commit 78850a89e62c095438a1e7a1c4a25da69b446a4b)
    
    Conflicts:
    	lib/ts/test_PriorityQueue.cc
---
 lib/ts/PriorityQueue.h       | 20 +++++++++++++++++++-
 lib/ts/test_PriorityQueue.cc | 30 ++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/lib/ts/PriorityQueue.h b/lib/ts/PriorityQueue.h
index 109f7d4..6b9f821 100644
--- a/lib/ts/PriorityQueue.h
+++ b/lib/ts/PriorityQueue.h
@@ -28,7 +28,8 @@
 #include "ts/Vec.h"
 
 template <typename T> struct PriorityQueueEntry {
-  PriorityQueueEntry(T n) : index(0), node(n) {}
+  PriorityQueueEntry(T n) : index(0), node(n){};
+  PriorityQueueEntry() : index(0){};
   uint32_t index;
   T node;
 };
@@ -52,6 +53,7 @@ public:
   void push(PriorityQueueEntry<T> *);
   void update(PriorityQueueEntry<T> *);
   void update(PriorityQueueEntry<T> *, bool);
+  void erase(PriorityQueueEntry<T> *);
   const Vec<PriorityQueueEntry<T> *> &dump() const;
 
 private:
@@ -115,6 +117,22 @@ PriorityQueue<T, Comp>::pop()
 
 template <typename T, typename Comp>
 void
+PriorityQueue<T, Comp>::erase(PriorityQueueEntry<T> *entry)
+{
+  if (empty()) {
+    return;
+  }
+
+  _v[entry->index] = _v[_v.length() - 1];
+  _v.pop();
+  _bubble_down(entry->index);
+  if (!empty()) {
+    _bubble_up(entry->index);
+  }
+}
+
+template <typename T, typename Comp>
+void
 PriorityQueue<T, Comp>::update(PriorityQueueEntry<T> *entry)
 {
   ink_release_assert(entry != NULL);
diff --git a/lib/ts/test_PriorityQueue.cc b/lib/ts/test_PriorityQueue.cc
index 3ade64b..807e000 100644
--- a/lib/ts/test_PriorityQueue.cc
+++ b/lib/ts/test_PriorityQueue.cc
@@ -278,6 +278,36 @@ REGRESSION_TEST(PriorityQueue_5)(RegressionTest *t, int /* atype ATS_UNUSED */,
   box.check(pq->top() == NULL, "top should be NULL");
 }
 
+// Test erase method
+REGRESSION_TEST(PriorityQueue_6)(RegressionTest *t, int /* atype ATS_UNUSED */, int *pstatus)
+{
+  TestBox box(t, pstatus);
+  box = REGRESSION_TEST_PASSED;
+
+  PQ *pq = new PQ();
+
+  N *a = new N(10, "A");
+  N *b = new N(20, "B");
+  N *c = new N(30, "C");
+
+  Entry *entry_a = new Entry(a);
+  Entry *entry_b = new Entry(b);
+  Entry *entry_c = new Entry(c);
+
+  pq->push(entry_a);
+  pq->push(entry_b);
+  pq->push(entry_c);
+
+  box.check(pq->top() == entry_a, "top should be entry_a");
+  pq->erase(entry_a);
+  box.check(pq->top() == entry_b, "top should be entry_b");
+  pq->erase(entry_c);
+  box.check(pq->top() == entry_b, "top should be entry_b");
+  pq->erase(entry_b);
+  box.check(pq->top() == NULL, "top should be NULL");
+  box.check(pq->empty(), "should be empty");
+}
+
 int
 main(int /* argc ATS_UNUSED */, const char ** /* argv ATS_UNUSED */)
 {

-- 
To stop receiving notification emails like this one, please contact
"commits@trafficserver.apache.org" <co...@trafficserver.apache.org>.