| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  dictionary.cpp                                                       */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2021-01-01 20:13:46 +01:00
										 |  |  | /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "dictionary.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-16 08:04:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-07 19:33:38 -03:00
										 |  |  | #include "core/templates/ordered_hash_map.h"
 | 
					
						
							|  |  |  | #include "core/templates/safe_refcount.h"
 | 
					
						
							|  |  |  | #include "core/variant/variant.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct DictionaryPrivate { | 
					
						
							|  |  |  | 	SafeRefCount refcount; | 
					
						
							| 
									
										
										
										
											2018-01-27 15:08:16 +01:00
										 |  |  | 	OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator> variant_map; | 
					
						
							| 
									
										
										
										
											2017-01-08 14:16:21 -03:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void Dictionary::get_key_list(List<Variant> *p_keys) const { | 
					
						
							| 
									
										
										
										
											2020-12-15 12:04:21 +00:00
										 |  |  | 	if (_p->variant_map.is_empty()) { | 
					
						
							| 
									
										
										
										
											2017-01-08 14:16:21 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-08 14:16:21 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-27 15:08:16 +01:00
										 |  |  | 	for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) { | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 		p_keys->push_back(E.key()); | 
					
						
							| 
									
										
										
										
											2017-01-08 14:16:21 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 17:57:44 -03:00
										 |  |  | Variant Dictionary::get_key_at_index(int p_index) const { | 
					
						
							|  |  |  | 	int index = 0; | 
					
						
							|  |  |  | 	for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) { | 
					
						
							|  |  |  | 		if (index == p_index) { | 
					
						
							|  |  |  | 			return E.key(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		index++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return Variant(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Variant Dictionary::get_value_at_index(int p_index) const { | 
					
						
							|  |  |  | 	int index = 0; | 
					
						
							|  |  |  | 	for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) { | 
					
						
							|  |  |  | 		if (index == p_index) { | 
					
						
							|  |  |  | 			return E.value(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		index++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return Variant(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Variant &Dictionary::operator[](const Variant &p_key) { | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 	return _p->variant_map[p_key]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | const Variant &Dictionary::operator[](const Variant &p_key) const { | 
					
						
							| 
									
										
										
										
											2017-11-07 17:49:16 +01:00
										 |  |  | 	return _p->variant_map[p_key]; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-05-14 14:29:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | const Variant *Dictionary::getptr(const Variant &p_key) const { | 
					
						
							| 
									
										
										
										
											2018-01-27 15:08:16 +01:00
										 |  |  | 	OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::ConstElement E = ((const OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator> *)&_p->variant_map)->find(p_key); | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (!E) { | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 		return nullptr; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 	return &E.get(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-01-08 14:16:21 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Variant *Dictionary::getptr(const Variant &p_key) { | 
					
						
							| 
									
										
										
										
											2018-01-27 15:08:16 +01:00
										 |  |  | 	OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.find(p_key); | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (!E) { | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 		return nullptr; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 	return &E.get(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Variant Dictionary::get_valid(const Variant &p_key) const { | 
					
						
							| 
									
										
										
										
											2018-01-27 15:08:16 +01:00
										 |  |  | 	OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::ConstElement E = ((const OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator> *)&_p->variant_map)->find(p_key); | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (!E) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		return Variant(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 	return E.get(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-30 00:04:32 -04:00
										 |  |  | Variant Dictionary::get(const Variant &p_key, const Variant &p_default) const { | 
					
						
							|  |  |  | 	const Variant *result = getptr(p_key); | 
					
						
							|  |  |  | 	if (!result) { | 
					
						
							|  |  |  | 		return p_default; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return *result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | int Dictionary::size() const { | 
					
						
							|  |  |  | 	return _p->variant_map.size(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-05-14 14:29:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-15 12:04:21 +00:00
										 |  |  | bool Dictionary::is_empty() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return !_p->variant_map.size(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool Dictionary::has(const Variant &p_key) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return _p->variant_map.has(p_key); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-04-04 18:37:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool Dictionary::has_all(const Array &p_keys) const { | 
					
						
							|  |  |  | 	for (int i = 0; i < p_keys.size(); i++) { | 
					
						
							|  |  |  | 		if (!has(p_keys[i])) { | 
					
						
							| 
									
										
										
										
											2016-04-04 18:37:43 +02:00
										 |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-14 19:19:05 +02:00
										 |  |  | bool Dictionary::erase(const Variant &p_key) { | 
					
						
							| 
									
										
										
										
											2018-07-18 23:07:31 +02:00
										 |  |  | 	return _p->variant_map.erase(p_key); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool Dictionary::operator==(const Dictionary &p_dictionary) const { | 
					
						
							|  |  |  | 	return _p == p_dictionary._p; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-06 16:20:41 -04:00
										 |  |  | bool Dictionary::operator!=(const Dictionary &p_dictionary) const { | 
					
						
							|  |  |  | 	return _p != p_dictionary._p; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void Dictionary::_ref(const Dictionary &p_from) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	//make a copy first (thread safe)
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (!p_from._p->refcount.ref()) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		return; // couldn't copy
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	//if this is the same, unreference the other one
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (p_from._p == _p) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		_p->refcount.unref(); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (_p) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		_unref(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	_p = p_from._p; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Dictionary::clear() { | 
					
						
							|  |  |  | 	_p->variant_map.clear(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Dictionary::_unref() const { | 
					
						
							|  |  |  | 	ERR_FAIL_COND(!_p); | 
					
						
							|  |  |  | 	if (_p->refcount.unref()) { | 
					
						
							|  |  |  | 		memdelete(_p); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 	_p = nullptr; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-05-14 14:29:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | uint32_t Dictionary::hash() const { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	uint32_t h = hash_djb2_one_32(Variant::DICTIONARY); | 
					
						
							| 
									
										
										
										
											2015-12-13 15:20:58 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 18:12:20 +02:00
										 |  |  | 	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); | 
					
						
							| 
									
										
										
										
											2015-12-13 15:20:58 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return h; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Array Dictionary::keys() const { | 
					
						
							| 
									
										
										
										
											2017-07-23 12:23:18 -03:00
										 |  |  | 	Array varr; | 
					
						
							| 
									
										
										
										
											2020-12-15 12:04:21 +00:00
										 |  |  | 	if (_p->variant_map.is_empty()) { | 
					
						
							| 
									
										
										
										
											2017-07-23 12:23:18 -03:00
										 |  |  | 		return varr; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-07-23 12:23:18 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 18:12:20 +02:00
										 |  |  | 	varr.resize(size()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 	int i = 0; | 
					
						
							| 
									
										
										
										
											2018-01-27 15:08:16 +01:00
										 |  |  | 	for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) { | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 		varr[i] = E.key(); | 
					
						
							|  |  |  | 		i++; | 
					
						
							| 
									
										
										
										
											2017-07-23 12:23:18 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return varr; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 14:20:52 +02:00
										 |  |  | Array Dictionary::values() const { | 
					
						
							|  |  |  | 	Array varr; | 
					
						
							| 
									
										
										
										
											2020-12-15 12:04:21 +00:00
										 |  |  | 	if (_p->variant_map.is_empty()) { | 
					
						
							| 
									
										
										
										
											2017-01-08 14:16:21 -03:00
										 |  |  | 		return varr; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-08 14:16:21 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 18:12:20 +02:00
										 |  |  | 	varr.resize(size()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 	int i = 0; | 
					
						
							| 
									
										
										
										
											2018-01-27 15:08:16 +01:00
										 |  |  | 	for (OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.front(); E; E = E.next()) { | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 		varr[i] = E.get(); | 
					
						
							|  |  |  | 		i++; | 
					
						
							| 
									
										
										
										
											2016-06-05 14:20:52 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-08 14:16:21 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 14:20:52 +02:00
										 |  |  | 	return varr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | const Variant *Dictionary::next(const Variant *p_key) const { | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 	if (p_key == nullptr) { | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 		// caller wants to get the first element
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		if (_p->variant_map.front()) { | 
					
						
							| 
									
										
										
										
											2017-12-05 20:00:44 +01:00
										 |  |  | 			return &_p->variant_map.front().key(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 		return nullptr; | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-01-27 15:08:16 +01:00
										 |  |  | 	OrderedHashMap<Variant, Variant, VariantHasher, VariantComparator>::Element E = _p->variant_map.find(*p_key); | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (E && E.next()) { | 
					
						
							| 
									
										
										
										
											2017-11-05 15:27:28 +01:00
										 |  |  | 		return &E.next().key(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 	return nullptr; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 21:16:08 +02:00
										 |  |  | Dictionary Dictionary::duplicate(bool p_deep) const { | 
					
						
							| 
									
										
										
										
											2017-01-11 08:53:31 -03:00
										 |  |  | 	Dictionary n; | 
					
						
							| 
									
										
										
										
											2016-08-02 19:11:05 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 18:12:20 +02:00
										 |  |  | 	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(); | 
					
						
							| 
									
										
										
										
											2016-08-02 19:11:05 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return n; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void Dictionary::operator=(const Dictionary &p_dictionary) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	_ref(p_dictionary); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-20 01:57:29 +02:00
										 |  |  | const void *Dictionary::id() const { | 
					
						
							|  |  |  | 	return _p->variant_map.id(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Dictionary::Dictionary(const Dictionary &p_from) { | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 	_p = nullptr; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	_ref(p_from); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-11 08:53:31 -03:00
										 |  |  | Dictionary::Dictionary() { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	_p = memnew(DictionaryPrivate); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	_p->refcount.init(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-05-14 14:29:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | Dictionary::~Dictionary() { | 
					
						
							|  |  |  | 	_unref(); | 
					
						
							|  |  |  | } |