From eb0a624902cc3136358bd1b69ae84e575f73a881 Mon Sep 17 00:00:00 2001 From: kobewi Date: Thu, 8 Sep 2022 18:14:10 +0200 Subject: [PATCH] Allow returning Dictionary after merging --- core/variant/dictionary.cpp | 7 +++++++ core/variant/dictionary.h | 1 + core/variant/variant_call.cpp | 1 + doc/classes/Dictionary.xml | 18 ++++++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/core/variant/dictionary.cpp b/core/variant/dictionary.cpp index 9f65a73c6fd..7416101d518 100644 --- a/core/variant/dictionary.cpp +++ b/core/variant/dictionary.cpp @@ -249,6 +249,7 @@ void Dictionary::clear() { } void Dictionary::merge(const Dictionary &p_dictionary, bool p_overwrite) { + ERR_FAIL_COND_MSG(_p->read_only, "Dictionary is in read-only state."); for (const KeyValue &E : p_dictionary._p->variant_map) { if (p_overwrite || !has(E.key)) { operator[](E.key) = E.value; @@ -256,6 +257,12 @@ void Dictionary::merge(const Dictionary &p_dictionary, bool p_overwrite) { } } +Dictionary Dictionary::merged(const Dictionary &p_dictionary, bool p_overwrite) const { + Dictionary ret = duplicate(); + ret.merge(p_dictionary, p_overwrite); + return ret; +} + void Dictionary::_unref() const { ERR_FAIL_NULL(_p); if (_p->refcount.unref()) { diff --git a/core/variant/dictionary.h b/core/variant/dictionary.h index f94a0da80a1..67178ee7b79 100644 --- a/core/variant/dictionary.h +++ b/core/variant/dictionary.h @@ -64,6 +64,7 @@ public: bool is_empty() const; void clear(); void merge(const Dictionary &p_dictionary, bool p_overwrite = false); + Dictionary merged(const Dictionary &p_dictionary, bool p_overwrite = false) const; bool has(const Variant &p_key) const; bool has_all(const Array &p_keys) const; diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp index 543ee1135f4..060ea007ff4 100644 --- a/core/variant/variant_call.cpp +++ b/core/variant/variant_call.cpp @@ -2205,6 +2205,7 @@ static void _register_variant_builtin_methods() { bind_method(Dictionary, is_empty, sarray(), varray()); bind_method(Dictionary, clear, sarray(), varray()); bind_method(Dictionary, merge, sarray("dictionary", "overwrite"), varray(false)); + bind_method(Dictionary, merged, sarray("dictionary", "overwrite"), varray(false)); bind_method(Dictionary, has, sarray("key"), varray()); bind_method(Dictionary, has_all, sarray("keys"), varray()); bind_method(Dictionary, find_key, sarray("value"), varray()); diff --git a/doc/classes/Dictionary.xml b/doc/classes/Dictionary.xml index 7a5e51e4ef3..14ce7c894ff 100644 --- a/doc/classes/Dictionary.xml +++ b/doc/classes/Dictionary.xml @@ -340,6 +340,24 @@ [b]Note:[/b] [method merge] is [i]not[/i] recursive. Nested dictionaries are considered as keys that can be overwritten or not depending on the value of [param overwrite], but they will never be merged together. + + + + + + Returns a copy of this dictionary merged with the other [param dictionary]. By default, duplicate keys are not copied over, unless [param overwrite] is [code]true[/code]. See also [method merge]. + This method is useful for quickly making dictionaries with default values: + [codeblock] + var base = { "fruit": "apple", "vegetable": "potato" } + var extra = { "fruit": "orange", "dressing": "vinegar" } + # Prints { "fruit": "orange", "vegetable": "potato", "dressing": "vinegar" } + print(extra.merged(base)) + # Prints { "fruit": "apple", "vegetable": "potato", "dressing": "vinegar" } + print(extra.merged(base, true)) + [/codeblock] + See also [method merge]. + +