Add shuffle() method to Array

This commit is contained in:
poke1024 2018-01-10 19:36:53 +01:00
parent a60896869e
commit 75d69fb4ec
4 changed files with 22 additions and 0 deletions

View file

@ -266,6 +266,20 @@ Array &Array::sort_custom(Object *p_obj, const StringName &p_function) {
return *this; return *this;
} }
void Array::shuffle() {
const int n = _p->array.size();
if (n < 2)
return;
Variant *data = _p->array.ptrw();
for (int i = n - 1; i >= 1; i--) {
const int j = Math::rand() % (i + 1);
const Variant tmp = data[j];
data[j] = data[i];
data[i] = tmp;
}
}
template <typename Less> template <typename Less>
_FORCE_INLINE_ int bisect(const Vector<Variant> &p_array, const Variant &p_value, bool p_before, const Less &p_less) { _FORCE_INLINE_ int bisect(const Vector<Variant> &p_array, const Variant &p_value, bool p_before, const Less &p_less) {

View file

@ -71,6 +71,7 @@ public:
Array &sort(); Array &sort();
Array &sort_custom(Object *p_obj, const StringName &p_function); Array &sort_custom(Object *p_obj, const StringName &p_function);
void shuffle();
int bsearch(const Variant &p_value, bool p_before = true); int bsearch(const Variant &p_value, bool p_before = true);
int bsearch_custom(const Variant &p_value, Object *p_obj, const StringName &p_function, bool p_before = true); int bsearch_custom(const Variant &p_value, Object *p_obj, const StringName &p_function, bool p_before = true);
Array &invert(); Array &invert();

View file

@ -490,6 +490,7 @@ struct _VariantCall {
VCALL_LOCALMEM1(Array, erase); VCALL_LOCALMEM1(Array, erase);
VCALL_LOCALMEM0(Array, sort); VCALL_LOCALMEM0(Array, sort);
VCALL_LOCALMEM2(Array, sort_custom); VCALL_LOCALMEM2(Array, sort_custom);
VCALL_LOCALMEM0(Array, shuffle);
VCALL_LOCALMEM2R(Array, bsearch); VCALL_LOCALMEM2R(Array, bsearch);
VCALL_LOCALMEM4R(Array, bsearch_custom); VCALL_LOCALMEM4R(Array, bsearch_custom);
VCALL_LOCALMEM0R(Array, duplicate); VCALL_LOCALMEM0R(Array, duplicate);
@ -1634,6 +1635,7 @@ void register_variant_methods() {
ADDFUNC0RNC(ARRAY, NIL, Array, pop_front, varray()); ADDFUNC0RNC(ARRAY, NIL, Array, pop_front, varray());
ADDFUNC0NC(ARRAY, NIL, Array, sort, varray()); ADDFUNC0NC(ARRAY, NIL, Array, sort, varray());
ADDFUNC2NC(ARRAY, NIL, Array, sort_custom, OBJECT, "obj", STRING, "func", varray()); ADDFUNC2NC(ARRAY, NIL, Array, sort_custom, OBJECT, "obj", STRING, "func", varray());
ADDFUNC0NC(ARRAY, NIL, Array, shuffle, varray());
ADDFUNC2R(ARRAY, INT, Array, bsearch, NIL, "value", BOOL, "before", varray(true)); ADDFUNC2R(ARRAY, INT, Array, bsearch, NIL, "value", BOOL, "before", varray(true));
ADDFUNC4R(ARRAY, INT, Array, bsearch_custom, NIL, "value", OBJECT, "obj", STRING, "func", BOOL, "before", varray(true)); ADDFUNC4R(ARRAY, INT, Array, bsearch_custom, NIL, "value", OBJECT, "obj", STRING, "func", BOOL, "before", varray(true));
ADDFUNC0NC(ARRAY, NIL, Array, invert, varray()); ADDFUNC0NC(ARRAY, NIL, Array, invert, varray());

View file

@ -296,6 +296,11 @@
[/codeblock] [/codeblock]
</description> </description>
</method> </method>
<method name="shuffle">
<description>
Shuffle the array such that the items will have a random order.
</description>
</method>
</methods> </methods>
<constants> <constants>
</constants> </constants>