util.indexedbheap: Fix a possible traceback when removing the last item.
authorWaqas Hussain <waqas20@gmail.com>
Wed, 23 Apr 2014 15:38:34 +0000 (11:38 -0400)
committerWaqas Hussain <waqas20@gmail.com>
Wed, 23 Apr 2014 15:38:34 +0000 (11:38 -0400)
util/indexedbheap.lua

index 3cb030370cae4198c3f05a9e781620b9a1bfbac6..c60861e812c8d951258e5b166439ba79d8b55905 100644 (file)
@@ -113,23 +113,27 @@ function indexed_heap:reprioritize(id, priority)
        k = _percolate_down(self.priorities, k, self.ids, self.index);
 end
 function indexed_heap:remove_index(k)
-       local size = #self.priorities;
-
        local result = self.priorities[k];
+       if result == nil then return; end
+
        local result_sync = self.ids[k];
        local item = self.items[result_sync];
-       if result == nil then return; end
-       self.index[result_sync] = nil;
-       self.items[result_sync] = nil;
+       local size = #self.priorities;
 
        self.priorities[k] = self.priorities[size];
        self.ids[k] = self.ids[size];
        self.index[self.ids[k]] = k;
+
        t_remove(self.priorities);
        t_remove(self.ids);
 
-       k = _percolate_up(self.priorities, k, self.ids, self.index);
-       k = _percolate_down(self.priorities, k, self.ids, self.index);
+       self.index[result_sync] = nil;
+       self.items[result_sync] = nil;
+
+       if size > k then
+               k = _percolate_up(self.priorities, k, self.ids, self.index);
+               k = _percolate_down(self.priorities, k, self.ids, self.index);
+       end
 
        return result, item, result_sync;
 end