From 3bcbb7c3920ebe2b83a4f0d038aad7d13f49ebdc Mon Sep 17 00:00:00 2001 From: Skidd13 Date: Thu, 18 Feb 2010 13:16:34 +0100 Subject: [PATCH 07/12] -Codechange: Perfer pointer instead of reference -Cleanup: merge PopHead() and RemoveHead() into Shift() --- src/misc/binaryheap.hpp | 24 ++++++++++-------------- src/pathfinder/yapf/nodelist.hpp | 11 +++++------ 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/misc/binaryheap.hpp b/src/misc/binaryheap.hpp index c95255e..f90ec0b 100644 --- a/src/misc/binaryheap.hpp +++ b/src/misc/binaryheap.hpp @@ -116,10 +116,10 @@ public: /** Find the smallest item in the priority queue. * Return the smallest item, or throw assert if empty. */ - FORCEINLINE T& GetHead() + FORCEINLINE T *Begin() { assert(!IsEmpty()); - return *m_items[1]; + return m_items[1]; } FORCEINLINE T *End() @@ -129,7 +129,7 @@ public: /** Insert new item into the priority queue, maintaining heap order. * @return false if the queue is full. */ - FORCEINLINE void Push(T& new_item) + FORCEINLINE void Push(T *new_item) { if (IsFull()) { m_max_size *= 2; @@ -137,31 +137,27 @@ public: } /* make place for new item */ - uint gap = HeapifyUp(++m_size, &new_item); - m_items[gap] = &new_item; + uint gap = HeapifyUp(++m_size, new_item); + m_items[gap] = new_item; CheckConsistency(); } /** Remove and return the smallest item from the priority queue. */ - FORCEINLINE T& PopHead() - { - T& ret = GetHead(); - RemoveHead(); - return ret; - } - - /** Remove the smallest item from the priority queue. */ - FORCEINLINE void RemoveHead() + FORCEINLINE T *Shift() { assert(!IsEmpty()); + T *first = Begin(); + m_size--; /* at index 1 we have a gap now */ T *last = End(); uint gap = HeapifyDown(1, last); /* move last item to the proper place */ if (!IsEmpty()) m_items[gap] = last; + CheckConsistency(); + return first; } /** Remove item specified by index */ diff --git a/src/pathfinder/yapf/nodelist.hpp b/src/pathfinder/yapf/nodelist.hpp index 9260c45..6ac3b94 100644 --- a/src/pathfinder/yapf/nodelist.hpp +++ b/src/pathfinder/yapf/nodelist.hpp @@ -93,7 +93,7 @@ public: { assert(m_closed.Find(item.GetKey()) == NULL); m_open.Push(item); - m_open_queue.Push(item); + m_open_queue.Push(&item); if (&item == m_new_node) { m_new_node = NULL; } @@ -103,8 +103,7 @@ public: FORCEINLINE Titem_ *GetBestOpenNode() { if (!m_open_queue.IsEmpty()) { - Titem_& item = m_open_queue.GetHead(); - return &item; + return m_open_queue.Begin(); } return NULL; } @@ -113,9 +112,9 @@ public: FORCEINLINE Titem_ *PopBestOpenNode() { if (!m_open_queue.IsEmpty()) { - Titem_& item = m_open_queue.PopHead(); - m_open.Pop(item); - return &item; + Titem_ *item = m_open_queue.Shift(); + m_open.Pop(*item); + return item; } return NULL; } -- 1.6.6