diff options
author | poke1024 <poke1024@gmx.de> | 2018-01-10 19:36:53 +0100 |
---|---|---|
committer | poke1024 <poke1024@gmx.de> | 2018-01-10 19:36:53 +0100 |
commit | 75d69fb4ecfe3bc925bd27700782d884e88369cc (patch) | |
tree | 29e863213b69e6d2c1fb192a0c36dae5327bb594 /core | |
parent | a60896869e6c17f674ff25bee87cabb54cd4403d (diff) |
Add shuffle() method to Array
Diffstat (limited to 'core')
-rw-r--r-- | core/array.cpp | 14 | ||||
-rw-r--r-- | core/array.h | 1 | ||||
-rw-r--r-- | core/variant_call.cpp | 2 |
3 files changed, 17 insertions, 0 deletions
diff --git a/core/array.cpp b/core/array.cpp index c53fea1f28..0ddac1662c 100644 --- a/core/array.cpp +++ b/core/array.cpp @@ -266,6 +266,20 @@ Array &Array::sort_custom(Object *p_obj, const StringName &p_function) { 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> _FORCE_INLINE_ int bisect(const Vector<Variant> &p_array, const Variant &p_value, bool p_before, const Less &p_less) { diff --git a/core/array.h b/core/array.h index 7c6fc59048..684a8e265d 100644 --- a/core/array.h +++ b/core/array.h @@ -71,6 +71,7 @@ public: Array &sort(); Array &sort_custom(Object *p_obj, const StringName &p_function); + void shuffle(); 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); Array &invert(); diff --git a/core/variant_call.cpp b/core/variant_call.cpp index e9f7af3f63..5ee7f48dda 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -490,6 +490,7 @@ struct _VariantCall { VCALL_LOCALMEM1(Array, erase); VCALL_LOCALMEM0(Array, sort); VCALL_LOCALMEM2(Array, sort_custom); + VCALL_LOCALMEM0(Array, shuffle); VCALL_LOCALMEM2R(Array, bsearch); VCALL_LOCALMEM4R(Array, bsearch_custom); VCALL_LOCALMEM0R(Array, duplicate); @@ -1634,6 +1635,7 @@ void register_variant_methods() { ADDFUNC0RNC(ARRAY, NIL, Array, pop_front, varray()); ADDFUNC0NC(ARRAY, NIL, Array, sort, 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)); ADDFUNC4R(ARRAY, INT, Array, bsearch_custom, NIL, "value", OBJECT, "obj", STRING, "func", BOOL, "before", varray(true)); ADDFUNC0NC(ARRAY, NIL, Array, invert, varray()); |