Просмотр исходного кода

Revert "Dictionary keys are now sorted by insertion order"

This reverts commit b8a16fbd0e56a2f55d62d0de07c91e3c6f0b6dd4.

Too cutting edge for the stable branch, it also makes Dictionary
twice slower.
Rémi Verschelde 8 лет назад
Родитель
Сommit
1a1b97e059
2 измененных файлов с 12 добавлено и 81 удалено
  1. 12 67
      core/dictionary.cpp
  2. 0 14
      core/hash_map.h

+ 12 - 67
core/dictionary.cpp

@@ -39,40 +39,14 @@ struct _DictionaryVariantHash {
 
 struct DictionaryPrivate {
 
-	struct Data {
-		Variant variant;
-		int order;
-	};
-
 	SafeRefCount refcount;
-	HashMap<Variant, Data, _DictionaryVariantHash> variant_map;
-	int counter;
+	HashMap<Variant, Variant, _DictionaryVariantHash> variant_map;
 	bool shared;
 };
 
-struct DictionaryPrivateSort {
-
-	bool operator()(const HashMap<Variant, DictionaryPrivate::Data, _DictionaryVariantHash>::Pair *A, const HashMap<Variant, DictionaryPrivate::Data, _DictionaryVariantHash>::Pair *B) const {
-
-		return A->data.order < B->data.order;
-	}
-};
-
 void Dictionary::get_key_list(List<Variant> *p_keys) const {
 
-	if (_p->variant_map.empty())
-		return;
-
-	int count = _p->variant_map.size();
-	const HashMap<Variant, DictionaryPrivate::Data, _DictionaryVariantHash>::Pair **pairs = (const HashMap<Variant, DictionaryPrivate::Data, _DictionaryVariantHash>::Pair **)alloca(count * sizeof(HashMap<Variant, DictionaryPrivate::Data, _DictionaryVariantHash>::Pair *));
-	_p->variant_map.get_key_value_ptr_array(pairs);
-
-	SortArray<const HashMap<Variant, DictionaryPrivate::Data, _DictionaryVariantHash>::Pair *, DictionaryPrivateSort> sort;
-	sort.sort(pairs, count);
-
-	for (int i = 0; i < count; i++) {
-		p_keys->push_back(pairs[i]->key);
-	}
+	_p->variant_map.get_key_list(p_keys);
 }
 
 void Dictionary::_copy_on_write() const {
@@ -93,47 +67,29 @@ Variant &Dictionary::operator[](const Variant &p_key) {
 
 	_copy_on_write();
 
-	DictionaryPrivate::Data *v = _p->variant_map.getptr(p_key);
-
-	if (!v) {
-
-		DictionaryPrivate::Data d;
-		d.order = _p->counter++;
-		_p->variant_map[p_key] = d;
-		v = _p->variant_map.getptr(p_key);
-	}
-	return v->variant;
+	return _p->variant_map[p_key];
 }
 
 const Variant &Dictionary::operator[](const Variant &p_key) const {
 
-	return _p->variant_map[p_key].variant;
+	return _p->variant_map[p_key];
 }
 const Variant *Dictionary::getptr(const Variant &p_key) const {
 
-	const DictionaryPrivate::Data *v = _p->variant_map.getptr(p_key);
-	if (!v)
-		return NULL;
-	else
-		return &v->variant;
+	return _p->variant_map.getptr(p_key);
 }
 Variant *Dictionary::getptr(const Variant &p_key) {
 
 	_copy_on_write();
-	DictionaryPrivate::Data *v = _p->variant_map.getptr(p_key);
-	if (!v)
-		return NULL;
-	else
-		return &v->variant;
+	return _p->variant_map.getptr(p_key);
 }
 
 Variant Dictionary::get_valid(const Variant &p_key) const {
 
-	DictionaryPrivate::Data *v = _p->variant_map.getptr(p_key);
+	const Variant *v = getptr(p_key);
 	if (!v)
 		return Variant();
-	else
-		return v->variant;
+	return *v;
 }
 
 int Dictionary::size() const {
@@ -189,7 +145,6 @@ void Dictionary::clear() {
 
 	_copy_on_write();
 	_p->variant_map.clear();
-	_p->counter = 0;
 }
 
 bool Dictionary::is_shared() const {
@@ -237,20 +192,11 @@ Array Dictionary::values() const {
 
 	Array varr;
 	varr.resize(size());
-	if (_p->variant_map.empty())
-		return varr;
-
-	int count = _p->variant_map.size();
-	const HashMap<Variant, DictionaryPrivate::Data, _DictionaryVariantHash>::Pair **pairs = (const HashMap<Variant, DictionaryPrivate::Data, _DictionaryVariantHash>::Pair **)alloca(count * sizeof(HashMap<Variant, DictionaryPrivate::Data, _DictionaryVariantHash>::Pair *));
-	_p->variant_map.get_key_value_ptr_array(pairs);
-
-	SortArray<const HashMap<Variant, DictionaryPrivate::Data, _DictionaryVariantHash>::Pair *, DictionaryPrivateSort> sort;
-	sort.sort(pairs, count);
-
-	for (int i = 0; i < count; i++) {
-		varr[i] = pairs[i]->data.variant;
+	const Variant *key = NULL;
+	int i = 0;
+	while ((key = next(key))) {
+		varr[i++] = _p->variant_map[*key];
 	}
-
 	return varr;
 }
 
@@ -293,7 +239,6 @@ Dictionary::Dictionary(bool p_shared) {
 
 	_p = memnew(DictionaryPrivate);
 	_p->refcount.init();
-	_p->counter = 0;
 	_p->shared = p_shared;
 }
 Dictionary::~Dictionary() {

+ 0 - 14
core/hash_map.h

@@ -570,20 +570,6 @@ public:
 		hash_table_power = 0;
 	}
 
-	void get_key_value_ptr_array(const Pair **p_pairs) const {
-		if (!hash_table)
-			return;
-		for (int i = 0; i < (1 << hash_table_power); i++) {
-
-			Entry *e = hash_table[i];
-			while (e) {
-				*p_pairs = &e->pair;
-				p_pairs++;
-				e = e->next;
-			}
-		}
-	}
-
 	void get_key_list(List<TKey> *p_keys) const {
 		if (!hash_table)
 			return;