Add generalized version of wrap function

This commit is contained in:
Yuri Rubinsky 2022-06-27 12:37:55 +03:00
parent 898e09e2e6
commit 2476c50a66
2 changed files with 68 additions and 0 deletions

View file

@ -267,6 +267,52 @@ struct VariantUtilityFunctions {
return Math::db2linear(db);
}
static inline Variant wrap(const Variant &p_x, const Variant &p_min, const Variant &p_max, Callable::CallError &r_error) {
Variant::Type x_type = p_x.get_type();
if (x_type != Variant::INT && x_type != Variant::FLOAT) {
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
r_error.argument = 0;
r_error.expected = x_type;
return Variant();
}
Variant::Type min_type = p_min.get_type();
if (min_type != Variant::INT && min_type != Variant::FLOAT) {
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
r_error.argument = 1;
r_error.expected = x_type;
return Variant();
}
Variant::Type max_type = p_max.get_type();
if (max_type != Variant::INT && max_type != Variant::FLOAT) {
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
r_error.argument = 2;
r_error.expected = x_type;
return Variant();
}
Variant value;
switch (x_type) {
case Variant::INT: {
if (x_type != min_type || x_type != max_type) {
value = wrapf((double)p_x, (double)p_min, (double)p_max);
} else {
value = wrapi((int)p_x, (int)p_min, (int)p_max);
}
} break;
case Variant::FLOAT: {
value = wrapf((double)p_x, (double)p_min, (double)p_max);
} break;
default:
break;
}
r_error.error = Callable::CallError::CALL_OK;
return value;
}
static inline int64_t wrapi(int64_t value, int64_t min, int64_t max) {
return Math::wrapi(value, min, max);
}
@ -1216,6 +1262,7 @@ void Variant::_register_variant_utility_functions() {
FUNCBINDR(linear2db, sarray("lin"), Variant::UTILITY_FUNC_TYPE_MATH);
FUNCBINDR(db2linear, sarray("db"), Variant::UTILITY_FUNC_TYPE_MATH);
FUNCBINDVR3(wrap, sarray("value", "min", "max"), Variant::UTILITY_FUNC_TYPE_MATH);
FUNCBINDR(wrapi, sarray("value", "min", "max"), Variant::UTILITY_FUNC_TYPE_MATH);
FUNCBINDR(wrapf, sarray("value", "min", "max"), Variant::UTILITY_FUNC_TYPE_MATH);