Daniele Bartolini 10 rokov pred
rodič
commit
74909f2a62
1 zmenil súbory, kde vykonal 7 pridanie a 6 odobranie
  1. 7 6
      src/core/containers/hash.h

+ 7 - 6
src/core/containers/hash.h

@@ -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;