summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorpoke1024 <poke1024@gmx.de>2018-01-10 19:36:53 +0100
committerpoke1024 <poke1024@gmx.de>2018-01-10 19:36:53 +0100
commit75d69fb4ecfe3bc925bd27700782d884e88369cc (patch)
tree29e863213b69e6d2c1fb192a0c36dae5327bb594 /core
parenta60896869e6c17f674ff25bee87cabb54cd4403d (diff)
Add shuffle() method to Array
Diffstat (limited to 'core')
-rw-r--r--core/array.cpp14
-rw-r--r--core/array.h1
-rw-r--r--core/variant_call.cpp2
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());