Skip to content

Commit a1cb590

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

18 files changed

+119
-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();
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: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,11 +735,23 @@ 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);
741747
}
742748

749+
Array Array::sorted_custom(const Callable &p_callable) const {
750+
Array ret = duplicate();
751+
ret.sort_custom(p_callable);
752+
return ret;
753+
}
754+
743755
void Array::shuffle() {
744756
ERR_FAIL_COND_MSG(_p->read_only, "Array is in read-only state.");
745757
const int n = _p->array.size();

core/variant/array.h

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

135135
void sort();
136+
Array sorted() const;
136137
void sort_custom(const Callable &p_callable);
138+
Array sorted_custom(const Callable &p_callable) const;
137139
void shuffle();
138140
int bsearch(const Variant &p_value, bool p_before = true) const;
139141
int bsearch_custom(const Variant &p_value, const Callable &p_callable, 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: 13 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,7 +2521,9 @@ 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());
2526+
bind_method(Array, sorted_custom, sarray("func"), varray());
25242527
bind_method(Array, shuffle, sarray(), varray());
25252528
bind_method(Array, bsearch, sarray("value", "before"), varray(true));
25262529
bind_method(Array, bsearch_custom, sarray("value", "func", "before"), varray(true));
@@ -2581,6 +2584,7 @@ static void _register_variant_builtin_methods_array() {
25812584
bind_method(PackedByteArray, reverse, sarray(), varray());
25822585
bind_method(PackedByteArray, slice, sarray("begin", "end"), varray(INT_MAX));
25832586
bind_method(PackedByteArray, sort, sarray(), varray());
2587+
bind_method(PackedByteArray, sorted, sarray(), varray());
25842588
bind_method(PackedByteArray, bsearch, sarray("value", "before"), varray(true));
25852589
bind_method(PackedByteArray, duplicate, sarray(), varray());
25862590
bind_method(PackedByteArray, find, sarray("value", "from"), varray(0));
@@ -2657,6 +2661,7 @@ static void _register_variant_builtin_methods_array() {
26572661
bind_method(PackedInt32Array, slice, sarray("begin", "end"), varray(INT_MAX));
26582662
bind_method(PackedInt32Array, to_byte_array, sarray(), varray());
26592663
bind_method(PackedInt32Array, sort, sarray(), varray());
2664+
bind_method(PackedInt32Array, sorted, sarray(), varray());
26602665
bind_method(PackedInt32Array, bsearch, sarray("value", "before"), varray(true));
26612666
bind_method(PackedInt32Array, duplicate, sarray(), varray());
26622667
bind_method(PackedInt32Array, find, sarray("value", "from"), varray(0));
@@ -2681,6 +2686,7 @@ static void _register_variant_builtin_methods_array() {
26812686
bind_method(PackedInt64Array, slice, sarray("begin", "end"), varray(INT_MAX));
26822687
bind_method(PackedInt64Array, to_byte_array, sarray(), varray());
26832688
bind_method(PackedInt64Array, sort, sarray(), varray());
2689+
bind_method(PackedInt64Array, sorted, sarray(), varray());
26842690
bind_method(PackedInt64Array, bsearch, sarray("value", "before"), varray(true));
26852691
bind_method(PackedInt64Array, duplicate, sarray(), varray());
26862692
bind_method(PackedInt64Array, find, sarray("value", "from"), varray(0));
@@ -2705,6 +2711,7 @@ static void _register_variant_builtin_methods_array() {
27052711
bind_method(PackedFloat32Array, slice, sarray("begin", "end"), varray(INT_MAX));
27062712
bind_method(PackedFloat32Array, to_byte_array, sarray(), varray());
27072713
bind_method(PackedFloat32Array, sort, sarray(), varray());
2714+
bind_method(PackedFloat32Array, sorted, sarray(), varray());
27082715
bind_method(PackedFloat32Array, bsearch, sarray("value", "before"), varray(true));
27092716
bind_method(PackedFloat32Array, duplicate, sarray(), varray());
27102717
bind_method(PackedFloat32Array, find, sarray("value", "from"), varray(0));
@@ -2729,6 +2736,7 @@ static void _register_variant_builtin_methods_array() {
27292736
bind_method(PackedFloat64Array, slice, sarray("begin", "end"), varray(INT_MAX));
27302737
bind_method(PackedFloat64Array, to_byte_array, sarray(), varray());
27312738
bind_method(PackedFloat64Array, sort, sarray(), varray());
2739+
bind_method(PackedFloat64Array, sorted, sarray(), varray());
27322740
bind_method(PackedFloat64Array, bsearch, sarray("value", "before"), varray(true));
27332741
bind_method(PackedFloat64Array, duplicate, sarray(), varray());
27342742
bind_method(PackedFloat64Array, find, sarray("value", "from"), varray(0));
@@ -2753,6 +2761,7 @@ static void _register_variant_builtin_methods_array() {
27532761
bind_method(PackedStringArray, slice, sarray("begin", "end"), varray(INT_MAX));
27542762
bind_function(PackedStringArray, to_byte_array, _VariantCall::func_PackedStringArray_to_byte_array, sarray(), varray());
27552763
bind_method(PackedStringArray, sort, sarray(), varray());
2764+
bind_method(PackedStringArray, sorted, sarray(), varray());
27562765
bind_method(PackedStringArray, bsearch, sarray("value", "before"), varray(true));
27572766
bind_method(PackedStringArray, duplicate, sarray(), varray());
27582767
bind_method(PackedStringArray, find, sarray("value", "from"), varray(0));
@@ -2777,6 +2786,7 @@ static void _register_variant_builtin_methods_array() {
27772786
bind_method(PackedVector2Array, slice, sarray("begin", "end"), varray(INT_MAX));
27782787
bind_method(PackedVector2Array, to_byte_array, sarray(), varray());
27792788
bind_method(PackedVector2Array, sort, sarray(), varray());
2789+
bind_method(PackedVector2Array, sorted, sarray(), varray());
27802790
bind_method(PackedVector2Array, bsearch, sarray("value", "before"), varray(true));
27812791
bind_method(PackedVector2Array, duplicate, sarray(), varray());
27822792
bind_method(PackedVector2Array, find, sarray("value", "from"), varray(0));
@@ -2801,6 +2811,7 @@ static void _register_variant_builtin_methods_array() {
28012811
bind_method(PackedVector3Array, slice, sarray("begin", "end"), varray(INT_MAX));
28022812
bind_method(PackedVector3Array, to_byte_array, sarray(), varray());
28032813
bind_method(PackedVector3Array, sort, sarray(), varray());
2814+
bind_method(PackedVector3Array, sorted, sarray(), varray());
28042815
bind_method(PackedVector3Array, bsearch, sarray("value", "before"), varray(true));
28052816
bind_method(PackedVector3Array, duplicate, sarray(), varray());
28062817
bind_method(PackedVector3Array, find, sarray("value", "from"), varray(0));
@@ -2825,6 +2836,7 @@ static void _register_variant_builtin_methods_array() {
28252836
bind_method(PackedColorArray, slice, sarray("begin", "end"), varray(INT_MAX));
28262837
bind_method(PackedColorArray, to_byte_array, sarray(), varray());
28272838
bind_method(PackedColorArray, sort, sarray(), varray());
2839+
bind_method(PackedColorArray, sorted, sarray(), varray());
28282840
bind_method(PackedColorArray, bsearch, sarray("value", "before"), varray(true));
28292841
bind_method(PackedColorArray, duplicate, sarray(), varray());
28302842
bind_method(PackedColorArray, find, sarray("value", "from"), varray(0));
@@ -2849,6 +2861,7 @@ static void _register_variant_builtin_methods_array() {
28492861
bind_method(PackedVector4Array, slice, sarray("begin", "end"), varray(INT_MAX));
28502862
bind_method(PackedVector4Array, to_byte_array, sarray(), varray());
28512863
bind_method(PackedVector4Array, sort, sarray(), varray());
2864+
bind_method(PackedVector4Array, sorted, sarray(), varray());
28522865
bind_method(PackedVector4Array, bsearch, sarray("value", "before"), varray(true));
28532866
bind_method(PackedVector4Array, duplicate, sarray(), varray());
28542867
bind_method(PackedVector4Array, find, sarray("value", "from"), varray(0));

doc/classes/Array.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,19 @@
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>
821+
<method name="sorted_custom" qualifiers="const">
822+
<return type="Array" />
823+
<param index="0" name="func" type="Callable" />
824+
<description>
825+
Returns a copy of this array sorted using a custom [Callable]. See also [method sort_custom].
826+
</description>
827+
</method>
815828
</methods>
816829
<operators>
817830
<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)