|
@@ -35,6 +35,7 @@
|
|
#include "core/object/script_language.h"
|
|
#include "core/object/script_language.h"
|
|
#include "core/templates/hashfuncs.h"
|
|
#include "core/templates/hashfuncs.h"
|
|
#include "core/templates/vector.h"
|
|
#include "core/templates/vector.h"
|
|
|
|
+#include "core/variant/callable.h"
|
|
#include "core/variant/variant.h"
|
|
#include "core/variant/variant.h"
|
|
|
|
|
|
class ArrayPrivate {
|
|
class ArrayPrivate {
|
|
@@ -371,25 +372,22 @@ void Array::sort() {
|
|
}
|
|
}
|
|
|
|
|
|
struct _ArrayVariantSortCustom {
|
|
struct _ArrayVariantSortCustom {
|
|
- Object *obj = nullptr;
|
|
|
|
- StringName func;
|
|
|
|
|
|
+ Callable func;
|
|
|
|
|
|
_FORCE_INLINE_ bool operator()(const Variant &p_l, const Variant &p_r) const {
|
|
_FORCE_INLINE_ bool operator()(const Variant &p_l, const Variant &p_r) const {
|
|
const Variant *args[2] = { &p_l, &p_r };
|
|
const Variant *args[2] = { &p_l, &p_r };
|
|
Callable::CallError err;
|
|
Callable::CallError err;
|
|
- bool res = obj->call(func, args, 2, err);
|
|
|
|
- if (err.error != Callable::CallError::CALL_OK) {
|
|
|
|
- res = false;
|
|
|
|
- }
|
|
|
|
|
|
+ Variant res;
|
|
|
|
+ func.call(args, 2, res, err);
|
|
|
|
+ ERR_FAIL_COND_V_MSG(err.error != Callable::CallError::CALL_OK, false,
|
|
|
|
+ "Error calling sorting method: " + Variant::get_callable_error_text(func, args, 1, err));
|
|
return res;
|
|
return res;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
-void Array::sort_custom(Object *p_obj, const StringName &p_function) {
|
|
|
|
- ERR_FAIL_NULL(p_obj);
|
|
|
|
|
|
|
|
|
|
+void Array::sort_custom(Callable p_callable) {
|
|
SortArray<Variant, _ArrayVariantSortCustom, true> avs;
|
|
SortArray<Variant, _ArrayVariantSortCustom, true> avs;
|
|
- avs.compare.obj = p_obj;
|
|
|
|
- avs.compare.func = p_function;
|
|
|
|
|
|
+ avs.compare.func = p_callable;
|
|
avs.sort(_p->array.ptrw(), _p->array.size());
|
|
avs.sort(_p->array.ptrw(), _p->array.size());
|
|
}
|
|
}
|
|
|
|
|
|
@@ -438,13 +436,11 @@ int Array::bsearch(const Variant &p_value, bool p_before) {
|
|
return bisect(_p->array, p_value, p_before, _ArrayVariantSort());
|
|
return bisect(_p->array, p_value, p_before, _ArrayVariantSort());
|
|
}
|
|
}
|
|
|
|
|
|
-int Array::bsearch_custom(const Variant &p_value, Object *p_obj, const StringName &p_function, bool p_before) {
|
|
|
|
|
|
+int Array::bsearch_custom(const Variant &p_value, Callable p_callable, bool p_before) {
|
|
ERR_FAIL_COND_V(!_p->typed.validate(p_value, "custom binary search"), -1);
|
|
ERR_FAIL_COND_V(!_p->typed.validate(p_value, "custom binary search"), -1);
|
|
- ERR_FAIL_NULL_V(p_obj, 0);
|
|
|
|
|
|
|
|
_ArrayVariantSortCustom less;
|
|
_ArrayVariantSortCustom less;
|
|
- less.obj = p_obj;
|
|
|
|
- less.func = p_function;
|
|
|
|
|
|
+ less.func = p_callable;
|
|
|
|
|
|
return bisect(_p->array, p_value, p_before, less);
|
|
return bisect(_p->array, p_value, p_before, less);
|
|
}
|
|
}
|