|
@@ -145,18 +145,19 @@ namespace crown
|
|
|
|
|
|
|
|
template<typename T> void erase(Hash<T>& h, const FindResult &fr)
|
|
template<typename T> void erase(Hash<T>& h, const FindResult &fr)
|
|
|
{
|
|
{
|
|
|
|
|
+ /// Fix from: https://bitbucket.org/bitsquid/foundation/issues/5/hash-erase-an-array-size-update-is-missing
|
|
|
if (fr.data_prev == END_OF_LIST)
|
|
if (fr.data_prev == END_OF_LIST)
|
|
|
h._hash[fr.hash_i] = h._data[fr.data_i].next;
|
|
h._hash[fr.hash_i] = h._data[fr.data_i].next;
|
|
|
else
|
|
else
|
|
|
h._data[fr.data_prev].next = h._data[fr.data_i].next;
|
|
h._data[fr.data_prev].next = h._data[fr.data_i].next;
|
|
|
|
|
|
|
|
- if (fr.data_i == array::size(h._data) - 1) {
|
|
|
|
|
- array::pop_back(h._data);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ array::pop_back(h._data);
|
|
|
|
|
+
|
|
|
|
|
+ if (fr.data_i == array::size(h._data)) return;
|
|
|
|
|
+
|
|
|
|
|
+ h._data[fr.data_i] = h._data[array::size(h._data)];
|
|
|
|
|
|
|
|
- h._data[fr.data_i] = h._data[array::size(h._data) - 1];
|
|
|
|
|
- FindResult last = find(h, h._data[fr.data_i].key);
|
|
|
|
|
|
|
+ FindResult last = find(h, &h._data[array::size(h._data)]);
|
|
|
|
|
|
|
|
if (last.data_prev != END_OF_LIST)
|
|
if (last.data_prev != END_OF_LIST)
|
|
|
h._data[last.data_prev].next = fr.data_i;
|
|
h._data[last.data_prev].next = fr.data_i;
|