Skip to content

Commit a101709

Browse files
committed
Add sorted() method to Arrays and Dictionary
1 parent 0fdb93c commit a101709

18 files changed

+104
-0
lines changed

core/templates/vector.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ class Vector {
163163
sort_custom<Comparator<T>>();
164164
}
165165

166+
Vector<T> sorted() const {
167+
Vector<T> result = *this;
168+
result.sort_custom<Comparator<T>>();
169+
return result;
170+
}
171+
166172
template <typename Comparator, bool Validate = SORT_ARRAY_VALIDATE_ENABLED, typename... Args>
167173
void sort_custom(Args &&...args) {
168174
Size len = _cowdata.size();

core/variant/array.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,12 @@ void Array::sort() {
735735
_p->array.sort_custom<_ArrayVariantSort>();
736736
}
737737

738+
Array Array::sorted() const {
739+
Array ret = duplicate();
740+
ret.sort();
741+
return ret;
742+
}
743+
738744
void Array::sort_custom(const Callable &p_callable) {
739745
ERR_FAIL_COND_MSG(_p->read_only, "Array is in read-only state.");
740746
_p->array.sort_custom<CallableComparator, true>(p_callable);

core/variant/array.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ class Array {
133133
Variant pick_random() const;
134134

135135
void sort();
136+
Array sorted() const;
136137
void sort_custom(const Callable &p_callable);
137138
void shuffle();
138139
int bsearch(const Variant &p_value, bool p_before = true) const;

core/variant/dictionary.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,12 @@ void Dictionary::sort() {
333333
_p->variant_map.sort_custom<_DictionaryVariantSort>();
334334
}
335335

336+
Dictionary Dictionary::sorted() const {
337+
Dictionary ret = duplicate();
338+
ret.sort();
339+
return ret;
340+
}
341+
336342
void Dictionary::merge(const Dictionary &p_dictionary, bool p_overwrite) {
337343
ERR_FAIL_COND_MSG(_p->read_only, "Dictionary is in read-only state.");
338344
for (const KeyValue<Variant, Variant> &E : p_dictionary._p->variant_map) {

core/variant/dictionary.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class Dictionary {
7575
void reserve(int p_new_capacity);
7676
void clear();
7777
void sort();
78+
Dictionary sorted() const;
7879
void merge(const Dictionary &p_dictionary, bool p_overwrite = false);
7980
Dictionary merged(const Dictionary &p_dictionary, bool p_overwrite = false) const;
8081

core/variant/variant_call.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2457,6 +2457,7 @@ static void _register_variant_builtin_methods_misc() {
24572457
bind_method(Dictionary, clear, sarray(), varray());
24582458
bind_method(Dictionary, assign, sarray("dictionary"), varray());
24592459
bind_method(Dictionary, sort, sarray(), varray());
2460+
bind_method(Dictionary, sorted, sarray(), varray());
24602461
bind_method(Dictionary, merge, sarray("dictionary", "overwrite"), varray(false));
24612462
bind_method(Dictionary, merged, sarray("dictionary", "overwrite"), varray(false));
24622463
bind_method(Dictionary, has, sarray("key"), varray());
@@ -2520,6 +2521,7 @@ static void _register_variant_builtin_methods_array() {
25202521
bind_method(Array, pop_front, sarray(), varray());
25212522
bind_method(Array, pop_at, sarray("position"), varray());
25222523
bind_method(Array, sort, sarray(), varray());
2524+
bind_method(Array, sorted, sarray(), varray());
25232525
bind_method(Array, sort_custom, sarray("func"), varray());
25242526
bind_method(Array, shuffle, sarray(), varray());
25252527
bind_method(Array, bsearch, sarray("value", "before"), varray(true));
@@ -2581,6 +2583,7 @@ static void _register_variant_builtin_methods_array() {
25812583
bind_method(PackedByteArray, reverse, sarray(), varray());
25822584
bind_method(PackedByteArray, slice, sarray("begin", "end"), varray(INT_MAX));
25832585
bind_method(PackedByteArray, sort, sarray(), varray());
2586+
bind_method(PackedByteArray, sorted, sarray(), varray());
25842587
bind_method(PackedByteArray, bsearch, sarray("value", "before"), varray(true));
25852588
bind_method(PackedByteArray, duplicate, sarray(), varray());
25862589
bind_method(PackedByteArray, find, sarray("value", "from"), varray(0));
@@ -2657,6 +2660,7 @@ static void _register_variant_builtin_methods_array() {
26572660
bind_method(PackedInt32Array, slice, sarray("begin", "end"), varray(INT_MAX));
26582661
bind_method(PackedInt32Array, to_byte_array, sarray(), varray());
26592662
bind_method(PackedInt32Array, sort, sarray(), varray());
2663+
bind_method(PackedInt32Array, sorted, sarray(), varray());
26602664
bind_method(PackedInt32Array, bsearch, sarray("value", "before"), varray(true));
26612665
bind_method(PackedInt32Array, duplicate, sarray(), varray());
26622666
bind_method(PackedInt32Array, find, sarray("value", "from"), varray(0));
@@ -2681,6 +2685,7 @@ static void _register_variant_builtin_methods_array() {
26812685
bind_method(PackedInt64Array, slice, sarray("begin", "end"), varray(INT_MAX));
26822686
bind_method(PackedInt64Array, to_byte_array, sarray(), varray());
26832687
bind_method(PackedInt64Array, sort, sarray(), varray());
2688+
bind_method(PackedInt64Array, sorted, sarray(), varray());
26842689
bind_method(PackedInt64Array, bsearch, sarray("value", "before"), varray(true));
26852690
bind_method(PackedInt64Array, duplicate, sarray(), varray());
26862691
bind_method(PackedInt64Array, find, sarray("value", "from"), varray(0));
@@ -2705,6 +2710,7 @@ static void _register_variant_builtin_methods_array() {
27052710
bind_method(PackedFloat32Array, slice, sarray("begin", "end"), varray(INT_MAX));
27062711
bind_method(PackedFloat32Array, to_byte_array, sarray(), varray());
27072712
bind_method(PackedFloat32Array, sort, sarray(), varray());
2713+
bind_method(PackedFloat32Array, sorted, sarray(), varray());
27082714
bind_method(PackedFloat32Array, bsearch, sarray("value", "before"), varray(true));
27092715
bind_method(PackedFloat32Array, duplicate, sarray(), varray());
27102716
bind_method(PackedFloat32Array, find, sarray("value", "from"), varray(0));
@@ -2729,6 +2735,7 @@ static void _register_variant_builtin_methods_array() {
27292735
bind_method(PackedFloat64Array, slice, sarray("begin", "end"), varray(INT_MAX));
27302736
bind_method(PackedFloat64Array, to_byte_array, sarray(), varray());
27312737
bind_method(PackedFloat64Array, sort, sarray(), varray());
2738+
bind_method(PackedFloat64Array, sorted, sarray(), varray());
27322739
bind_method(PackedFloat64Array, bsearch, sarray("value", "before"), varray(true));
27332740
bind_method(PackedFloat64Array, duplicate, sarray(), varray());
27342741
bind_method(PackedFloat64Array, find, sarray("value", "from"), varray(0));
@@ -2753,6 +2760,7 @@ static void _register_variant_builtin_methods_array() {
27532760
bind_method(PackedStringArray, slice, sarray("begin", "end"), varray(INT_MAX));
27542761
bind_function(PackedStringArray, to_byte_array, _VariantCall::func_PackedStringArray_to_byte_array, sarray(), varray());
27552762
bind_method(PackedStringArray, sort, sarray(), varray());
2763+
bind_method(PackedStringArray, sorted, sarray(), varray());
27562764
bind_method(PackedStringArray, bsearch, sarray("value", "before"), varray(true));
27572765
bind_method(PackedStringArray, duplicate, sarray(), varray());
27582766
bind_method(PackedStringArray, find, sarray("value", "from"), varray(0));
@@ -2777,6 +2785,7 @@ static void _register_variant_builtin_methods_array() {
27772785
bind_method(PackedVector2Array, slice, sarray("begin", "end"), varray(INT_MAX));
27782786
bind_method(PackedVector2Array, to_byte_array, sarray(), varray());
27792787
bind_method(PackedVector2Array, sort, sarray(), varray());
2788+
bind_method(PackedVector2Array, sorted, sarray(), varray());
27802789
bind_method(PackedVector2Array, bsearch, sarray("value", "before"), varray(true));
27812790
bind_method(PackedVector2Array, duplicate, sarray(), varray());
27822791
bind_method(PackedVector2Array, find, sarray("value", "from"), varray(0));
@@ -2801,6 +2810,7 @@ static void _register_variant_builtin_methods_array() {
28012810
bind_method(PackedVector3Array, slice, sarray("begin", "end"), varray(INT_MAX));
28022811
bind_method(PackedVector3Array, to_byte_array, sarray(), varray());
28032812
bind_method(PackedVector3Array, sort, sarray(), varray());
2813+
bind_method(PackedVector3Array, sorted, sarray(), varray());
28042814
bind_method(PackedVector3Array, bsearch, sarray("value", "before"), varray(true));
28052815
bind_method(PackedVector3Array, duplicate, sarray(), varray());
28062816
bind_method(PackedVector3Array, find, sarray("value", "from"), varray(0));
@@ -2825,6 +2835,7 @@ static void _register_variant_builtin_methods_array() {
28252835
bind_method(PackedColorArray, slice, sarray("begin", "end"), varray(INT_MAX));
28262836
bind_method(PackedColorArray, to_byte_array, sarray(), varray());
28272837
bind_method(PackedColorArray, sort, sarray(), varray());
2838+
bind_method(PackedColorArray, sorted, sarray(), varray());
28282839
bind_method(PackedColorArray, bsearch, sarray("value", "before"), varray(true));
28292840
bind_method(PackedColorArray, duplicate, sarray(), varray());
28302841
bind_method(PackedColorArray, find, sarray("value", "from"), varray(0));
@@ -2849,6 +2860,7 @@ static void _register_variant_builtin_methods_array() {
28492860
bind_method(PackedVector4Array, slice, sarray("begin", "end"), varray(INT_MAX));
28502861
bind_method(PackedVector4Array, to_byte_array, sarray(), varray());
28512862
bind_method(PackedVector4Array, sort, sarray(), varray());
2863+
bind_method(PackedVector4Array, sorted, sarray(), varray());
28522864
bind_method(PackedVector4Array, bsearch, sarray("value", "before"), varray(true));
28532865
bind_method(PackedVector4Array, duplicate, sarray(), varray());
28542866
bind_method(PackedVector4Array, find, sarray("value", "from"), varray(0));

doc/classes/Array.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,12 @@
812812
[b]Note:[/b] You should not randomize the return value of [param func], as the heapsort algorithm expects a consistent result. Randomizing the return value will result in unexpected behavior.
813813
</description>
814814
</method>
815+
<method name="sorted" qualifiers="const">
816+
<return type="Array" />
817+
<description>
818+
Returns a sorted copy of this array. See also [method sort].
819+
</description>
820+
</method>
815821
</methods>
816822
<operators>
817823
<operator name="operator !=">

doc/classes/Dictionary.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,12 @@
531531
This method ensures that the dictionary's entries are ordered consistently when [method keys] or [method values] are called, or when the dictionary needs to be converted to a string through [method @GlobalScope.str] or [method JSON.stringify].
532532
</description>
533533
</method>
534+
<method name="sorted" qualifiers="const">
535+
<return type="Dictionary" />
536+
<description>
537+
Returns a sorted copy of this dictionary. See also [method sort].
538+
</description>
539+
</method>
534540
<method name="values" qualifiers="const">
535541
<return type="Array" />
536542
<description>

doc/classes/PackedByteArray.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,12 @@
497497
Sorts the elements of the array in ascending order.
498498
</description>
499499
</method>
500+
<method name="sorted" qualifiers="const">
501+
<return type="PackedByteArray" />
502+
<description>
503+
Returns a sorted copy of this array. See also [method sort].
504+
</description>
505+
</method>
500506
<method name="to_color_array" qualifiers="const">
501507
<return type="PackedColorArray" />
502508
<description>

doc/classes/PackedColorArray.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,12 @@
196196
Sorts the elements of the array in ascending order.
197197
</description>
198198
</method>
199+
<method name="sorted" qualifiers="const">
200+
<return type="PackedColorArray" />
201+
<description>
202+
Returns a sorted copy of this array. See also [method sort].
203+
</description>
204+
</method>
199205
<method name="to_byte_array" qualifiers="const">
200206
<return type="PackedByteArray" />
201207
<description>

0 commit comments

Comments
 (0)