summaryrefslogtreecommitdiff
path: root/core/variant/variant_op.h
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <remi@verschelde.fr>2022-05-11 16:58:33 +0200
committerGitHub <noreply@github.com>2022-05-11 16:58:33 +0200
commitd68c355145d5c07070fc999eedf8c973d8c70fbe (patch)
treee742dd05ac899338debc63b5ec33ddc4e81ac569 /core/variant/variant_op.h
parent0b0beae097b887feec721297e33de15e139baafc (diff)
parentdbd7a315074257bca834e1448b53a905ebb8dd8b (diff)
Merge pull request #58873 from Chaosus/power_op
Implement exponential operator (**) to GDScript/Expressions
Diffstat (limited to 'core/variant/variant_op.h')
-rw-r--r--core/variant/variant_op.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/core/variant/variant_op.h b/core/variant/variant_op.h
index f72a92d31a..3e9bae1078 100644
--- a/core/variant/variant_op.h
+++ b/core/variant/variant_op.h
@@ -92,6 +92,24 @@ public:
};
template <class R, class A, class B>
+class OperatorEvaluatorPow {
+public:
+ static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {
+ const A &a = *VariantGetInternalPtr<A>::get_ptr(&p_left);
+ const B &b = *VariantGetInternalPtr<B>::get_ptr(&p_right);
+ *r_ret = R(Math::pow((double)a, (double)b));
+ r_valid = true;
+ }
+ static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
+ *VariantGetInternalPtr<R>::get_ptr(r_ret) = R(Math::pow((double)*VariantGetInternalPtr<A>::get_ptr(left), (double)*VariantGetInternalPtr<B>::get_ptr(right)));
+ }
+ static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
+ PtrToArg<R>::encode(R(Math::pow((double)PtrToArg<A>::convert(left), (double)PtrToArg<B>::convert(right))), r_ret);
+ }
+ static Variant::Type get_return_type() { return GetTypeInfo<R>::VARIANT_TYPE; }
+};
+
+template <class R, class A, class B>
class OperatorEvaluatorXForm {
public:
static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) {