Browse Source

Merge pull request #32719 from nekomatata/dictionary-optimization

Optimized Dictionary hash() and duplicate() methods
Rémi Verschelde 5 years ago
parent
commit
c994eaa852
1 changed files with 9 additions and 14 deletions
  1. 9 14
      core/dictionary.cpp

+ 9 - 14
core/dictionary.cpp

@@ -192,13 +192,9 @@ uint32_t Dictionary::hash() const {
 
 	uint32_t h = hash_djb2_one_32(Variant::DICTIONARY);
 
-	List<Variant> keys;
-	get_key_list(&keys);
-
-	for (List<Variant>::Element *E = keys.front(); E; E = E->next()) {
-
-		h = hash_djb2_one_32(E->get().hash(), h);
-		h = hash_djb2_one_32(operator[](E->get()).hash(), h);
+	for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) {
+		h = hash_djb2_one_32(E.key().hash(), h);
+		h = hash_djb2_one_32(E.value().hash(), h);
 	}
 
 	return h;
@@ -207,10 +203,11 @@ uint32_t Dictionary::hash() const {
 Array Dictionary::keys() const {
 
 	Array varr;
-	varr.resize(size());
 	if (_p->variant_map.empty())
 		return varr;
 
+	varr.resize(size());
+
 	int i = 0;
 	for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) {
 		varr[i] = E.key();
@@ -223,10 +220,11 @@ Array Dictionary::keys() const {
 Array Dictionary::values() const {
 
 	Array varr;
-	varr.resize(size());
 	if (_p->variant_map.empty())
 		return varr;
 
+	varr.resize(size());
+
 	int i = 0;
 	for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) {
 		varr[i] = E.get();
@@ -255,11 +253,8 @@ Dictionary Dictionary::duplicate(bool p_deep) const {
 
 	Dictionary n;
 
-	List<Variant> keys;
-	get_key_list(&keys);
-
-	for (List<Variant>::Element *E = keys.front(); E; E = E->next()) {
-		n[E->get()] = p_deep ? operator[](E->get()).duplicate(p_deep) : operator[](E->get());
+	for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) {
+		n[E.key()] = p_deep ? E.value().duplicate(true) : E.value();
 	}
 
 	return n;