From 7f0d686a646fd86454599fcdb1efad888e4b0257 Mon Sep 17 00:00:00 2001 From: Artem Zyktin Date: Thu, 4 Jun 2026 02:05:59 +0800 Subject: [PATCH] Add square magnitude 3 operator --- src/tenvex/expressions/core.h | 6 +++ src/tenvex/expressions/magnitude3_sq.h | 35 ++++++++++++++++++ src/tenvex/expressions/magnitude3_sq_impl.hpp | 37 +++++++++++++++++++ src/tenvex/tenvex.h | 1 + 4 files changed, 79 insertions(+) create mode 100644 src/tenvex/expressions/magnitude3_sq.h create mode 100644 src/tenvex/expressions/magnitude3_sq_impl.hpp diff --git a/src/tenvex/expressions/core.h b/src/tenvex/expressions/core.h index 69c44f2..3d22d6f 100644 --- a/src/tenvex/expressions/core.h +++ b/src/tenvex/expressions/core.h @@ -101,6 +101,12 @@ vf4 magnitude3(vf4 v) noexcept return _mm_sqrt_ps(dot3(v, v)); } +[[nodiscard]] TNVX_INLINE +vf4 magnitude3_sq(vf4 v) noexcept +{ + return dot3(v, v); +} + [[nodiscard]] TNVX_INLINE vf4 norm3(vf4 v) noexcept { diff --git a/src/tenvex/expressions/magnitude3_sq.h b/src/tenvex/expressions/magnitude3_sq.h new file mode 100644 index 0000000..f1505d3 --- /dev/null +++ b/src/tenvex/expressions/magnitude3_sq.h @@ -0,0 +1,35 @@ +#pragma once + +#include "core.h" +#include "expression.h" +#include "traits.h" +#include "concepts.h" + +namespace tnvx +{ + +template +struct Magn3Sq : Expr> +{ + TNVX_INLINE + explicit Magn3Sq(const E& e) noexcept; + + [[nodiscard]] TNVX_INLINE + vf4 eval() const noexcept; + + [[nodiscard]] TNVX_INLINE + operator float() const noexcept; + +private: + tnvx_ref_or_value_t _e; +}; + +template inline constexpr bool is_scalar_expr> = true; + +template +[[nodiscard]] TNVX_INLINE +Magn3Sq magnitude3_sq(const E& e) noexcept; + +} + +#include "magnitude3_sq_impl.hpp" diff --git a/src/tenvex/expressions/magnitude3_sq_impl.hpp b/src/tenvex/expressions/magnitude3_sq_impl.hpp new file mode 100644 index 0000000..088bbab --- /dev/null +++ b/src/tenvex/expressions/magnitude3_sq_impl.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include "magnitude3_sq.h" + +namespace tnvx +{ + +template +TNVX_INLINE +Magn3Sq::Magn3Sq(const E& e) noexcept + : _e(e) +{ +} + +template +TNVX_INLINE +vf4 Magn3Sq::eval() const noexcept +{ + return detail::magnitude3_sq(_e.eval()); +} + +template +TNVX_INLINE +Magn3Sq::operator float() const noexcept +{ + return detail::to_float(eval()); +} + +template +TNVX_INLINE +Magn3Sq magnitude3_sq(const E& e) noexcept +{ + return Magn3Sq(e); +} + + +} diff --git a/src/tenvex/tenvex.h b/src/tenvex/tenvex.h index c9e9162..92b4268 100644 --- a/src/tenvex/tenvex.h +++ b/src/tenvex/tenvex.h @@ -9,6 +9,7 @@ #include "expressions/dot3.h" #include "expressions/dot4.h" #include "expressions/magnitude3.h" +#include "expressions/magnitude3_sq.h" #include "expressions/norm3.h" #include "expressions/cross3.h" #include "expressions/vec4.h"