Software / code / prosody
Comparison
util/indexedbheap.lua @ 6151:a34a14054532
util.indexedbheap: Fix a possible traceback when removing the last item.
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Wed, 23 Apr 2014 11:38:34 -0400 |
| parent | 5876:f62ad84811df |
| child | 8382:e5d00bf4a4d5 |
comparison
equal
deleted
inserted
replaced
| 6150:5b59798c979a | 6151:a34a14054532 |
|---|---|
| 111 | 111 |
| 112 k = _percolate_up(self.priorities, k, self.ids, self.index); | 112 k = _percolate_up(self.priorities, k, self.ids, self.index); |
| 113 k = _percolate_down(self.priorities, k, self.ids, self.index); | 113 k = _percolate_down(self.priorities, k, self.ids, self.index); |
| 114 end | 114 end |
| 115 function indexed_heap:remove_index(k) | 115 function indexed_heap:remove_index(k) |
| 116 local size = #self.priorities; | 116 local result = self.priorities[k]; |
| 117 if result == nil then return; end | |
| 117 | 118 |
| 118 local result = self.priorities[k]; | |
| 119 local result_sync = self.ids[k]; | 119 local result_sync = self.ids[k]; |
| 120 local item = self.items[result_sync]; | 120 local item = self.items[result_sync]; |
| 121 if result == nil then return; end | 121 local size = #self.priorities; |
| 122 self.index[result_sync] = nil; | |
| 123 self.items[result_sync] = nil; | |
| 124 | 122 |
| 125 self.priorities[k] = self.priorities[size]; | 123 self.priorities[k] = self.priorities[size]; |
| 126 self.ids[k] = self.ids[size]; | 124 self.ids[k] = self.ids[size]; |
| 127 self.index[self.ids[k]] = k; | 125 self.index[self.ids[k]] = k; |
| 126 | |
| 128 t_remove(self.priorities); | 127 t_remove(self.priorities); |
| 129 t_remove(self.ids); | 128 t_remove(self.ids); |
| 130 | 129 |
| 131 k = _percolate_up(self.priorities, k, self.ids, self.index); | 130 self.index[result_sync] = nil; |
| 132 k = _percolate_down(self.priorities, k, self.ids, self.index); | 131 self.items[result_sync] = nil; |
| 132 | |
| 133 if size > k then | |
| 134 k = _percolate_up(self.priorities, k, self.ids, self.index); | |
| 135 k = _percolate_down(self.priorities, k, self.ids, self.index); | |
| 136 end | |
| 133 | 137 |
| 134 return result, item, result_sync; | 138 return result, item, result_sync; |
| 135 end | 139 end |
| 136 function indexed_heap:remove(id) | 140 function indexed_heap:remove(id) |
| 137 return self:remove_index(self.index[id]); | 141 return self:remove_index(self.index[id]); |