From d891d21ec266784ca3b5e9188fd7841c1f857197 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 15 Jan 2021 17:58:20 +0300 Subject: [PATCH] Support 0-dimensional vectors --- libs/geom/include/psemek/geom/vector.hpp | 39 +++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/libs/geom/include/psemek/geom/vector.hpp b/libs/geom/include/psemek/geom/vector.hpp index 8608e4e7..f4947f5d 100644 --- a/libs/geom/include/psemek/geom/vector.hpp +++ b/libs/geom/include/psemek/geom/vector.hpp @@ -3,11 +3,33 @@ #include #include #include +#include #include namespace psemek::geom { + namespace detail + { + + template + struct empty_array_helper + { + using type = T[N]; + }; + + template + struct empty_array_helper + { + struct type + { + T const & operator[](std::size_t) const { throw std::runtime_error("Attempt to index a zero vector"); } + T & operator[](std::size_t) { throw std::runtime_error("Attempt to index a zero vector"); } + }; + }; + + } + template struct vector { @@ -15,7 +37,7 @@ namespace psemek::geom using scalar_type = T; - T coords[N]; + detail::empty_array_helper::type coords; vector() = default; vector(vector const &) = default; @@ -295,6 +317,15 @@ namespace psemek::geom return ort(v0, v1); } + template + vector pointwise_mult(vector const & v0, vector const & v1) + { + vector result; + for (std::size_t i = 0; i < N; ++i) + result[i] = v0[i] * v1[i]; + return result; + } + template vector lerp(vector const & v0, vector const & v1, T const & t) { @@ -327,6 +358,12 @@ namespace psemek::geom template Stream & operator << (Stream & os, vector const & v) { + if constexpr (N == 0) + { + os << "()"; + return os; + } + os << '(' << v[0]; for (std::size_t i = 1; i < N; ++i) os << ", " << v[i];