Skip to content

Commit

Permalink
[3.x] Add a get_or_add method to Dictionary
Browse files Browse the repository at this point in the history
Co-authored-by: Aaron Franke <arnfranke@yahoo.com>
  • Loading branch information
SysError99 and aaronfranke committed Feb 15, 2024
1 parent 354404d commit b3f93ad
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 0 deletions.
9 changes: 9 additions & 0 deletions core/dictionary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,15 @@ Variant Dictionary::get(const Variant &p_key, const Variant &p_default) const {
return *result;
}

Variant Dictionary::get_or_add(const Variant &p_key, const Variant &p_default) {
const Variant *result = getptr(p_key);
if (!result) {
operator[](p_key) = p_default;
return p_default;
}
return *result;
}

int Dictionary::size() const {
return _p->variant_map.size();
}
Expand Down
1 change: 1 addition & 0 deletions core/dictionary.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class Dictionary {

Variant get_valid(const Variant &p_key) const;
Variant get(const Variant &p_key, const Variant &p_default) const;
Variant get_or_add(const Variant &p_key, const Variant &p_default);

int size() const;
bool empty() const;
Expand Down
2 changes: 2 additions & 0 deletions core/variant_call.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,7 @@ struct _VariantCall {
VCALL_LOCALMEM0R(Dictionary, values);
VCALL_LOCALMEM1R(Dictionary, duplicate);
VCALL_LOCALMEM2R(Dictionary, get);
VCALL_LOCALMEM2R(Dictionary, get_or_add);

VCALL_LOCALMEM2(Array, set);
VCALL_LOCALMEM1R(Array, get);
Expand Down Expand Up @@ -1944,6 +1945,7 @@ void register_variant_methods() {
ADDFUNC0R(DICTIONARY, ARRAY, Dictionary, values, varray());
ADDFUNC1R(DICTIONARY, DICTIONARY, Dictionary, duplicate, BOOL, "deep", varray(false));
ADDFUNC2R(DICTIONARY, NIL, Dictionary, get, NIL, "key", NIL, "default", varray(Variant()));
ADDFUNC2R(DICTIONARY, NIL, Dictionary, get_or_add, NIL, "key", NIL, "default", varray(Variant()));

ADDFUNC0R(ARRAY, INT, Array, size, varray());
ADDFUNC0R(ARRAY, BOOL, Array, empty, varray());
Expand Down
8 changes: 8 additions & 0 deletions doc/classes/Dictionary.xml
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,14 @@
Returns the current value for the specified key in the [Dictionary]. If the key does not exist, the method returns the value of the optional default argument, or [code]null[/code] if it is omitted.
</description>
</method>
<method name="get_or_add">
<return type="Variant" />
<argument index="0" name="key" type="Variant" />
<argument index="1" name="default" type="Variant" default="null" />
<description>
Gets a value and ensures the key is set. If the [code]key[/code] exists in the dictionary, this behaves like [method get]. Otherwise, the [code]default[/code] value is inserted into the dictionary and returned.
</description>
</method>
<method name="has">
<return type="bool" />
<argument index="0" name="key" type="Variant" />
Expand Down

0 comments on commit b3f93ad

Please sign in to comment.